1.1.1.11. fejezet, Külső program futtatás

Shell program futtatásával sok programot elérhetünk, ami már készen várja, hogy a felhasználó kezei közt elvégezze a feladatát. Most erre lássunk egy példát:

String cmd = "tracert";
ProcessBuilder pb = new ProcessBuilder(cmd);
Map<String, String> env = pb.environment();
env.put("CHARSET", "cp852");
String homeDir="c:/";
File file = new File(homeDir);
pb.directory(file);
 
Process p = null;
try {
  p = pb.start();
  InputStream inputStream = p.getInputStream();
  InputStream errorStream = p.getErrorStream();
  //... process inputStream
} catch (IOException e) {
  e.printStackTrace();
} finally {
  if (p != null) {
    p.destroy();
  }
}

Az InputStream read metódusa -1-et ad vissza, ha elért a file végére, azaz lefutott a külső program. (Ha Eclipse-et használunk Windows-on, ne felejtsük el beállítani az alkalmazott karakter készletet cp852-re, különben az ékezetek hibásan jelennek meg.)

ByteArrayOutputStream oByteArrayStream = new ByteArrayOutputStream();
byte[] iOut = new byte[20];
int iCnt = 0;
 
do {
  iCnt = inputStream.read(iOut);
  if (iCnt > 0) {
    oByteArrayStream.write(iOut, 0, iCnt);
  }
} while (iCnt != -1);
System.out.print(oByteArrayStream.toString("cp852"));

Ellenben a hiba csatornán nem küld -1 értéket, csak az available metódus ad vissza 0-át.

byte[] eOut = new byte[20];
int eAvailable;
int eCnt = 0;
ByteArrayOutputStream errorByteArrayStream = new ByteArrayOutputStream();
 
do {
  eAvailable = errorStream.available();
  eCnt = eAvailable > 0 ? errorStream.read(eOut) : 0;
  if (eAvailable > 0) {
    errorByteArrayStream.write(eOut, 0, eCnt);
  }
} while (eCnt > 0);
System.out.print(errorByteArrayStream.toString("cp852"));

Itt a futtatott program kimenetével arányosan növekszik a kiolvasott válasz tárterület. Érdemes ezt figyelembe venni a tervezéskor, és elgondolkodni az azonnali feldolgozáson. A fenti csak egy kis példa a kimenet feldolgozásához.

Van egy másik megoldása a külső program futtatásának:

    private static void runtime() {
        String command = "cmd /c dir c:\\";
        Process p = null;
        try {
            p = Runtime.getRuntime().exec(command);
            InputStreamReader in = new InputStreamReader(p.getInputStream());
            LineNumberReader lineReader = new LineNumberReader(in);
            String line = lineReader.readLine();
            if (line != null) {
                do {
                    System.out.println(line);
                    line = lineReader.readLine();
                } while (line != null);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (p != null) {
                p.destroy();
            }
        }
 
    }

Itt azonban a szülő Java környezetben fut a parancs. Az első megoldásnál saját környezetet állíthatunk be a ProcessBuilder segítségével. Ezzel könnyebben kezelhetők a környezeti változók, és egyértelműbb a Runtime osztály szerepe. A Runtime-on keresztül ugyanis képesek vagyunk a JVM környezetével kapcsolatos értékek (pl.: memória használat, maximum memória, processzorok száma) kiolvasására, shutdown értesítő metódus (hook) beállítására, a szemétgyűjtő (GC) elérésére. Az 5.0-ás Java már külön osztályba és osztály struktúrákba helyezte a külső program futtatását, és ez a ProcessBuilder.

Külső program futásának ellenőrzése Windows rendszeren:

String findProcess = "chrome.exe";
String filenameFilter = "/nh /fi \"Imagename eq "+findProcess+"\"";
String tasksCmd = System.getenv("windir") +"/system32/tasklist.exe "+filenameFilter;
 
Process p = Runtime.getRuntime().exec(tasksCmd);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
 
ArrayList<String> procs = new ArrayList<String>();
String line = null;
while ((line = input.readLine()) != null) 
    procs.add(line);
 
input.close();
 
Boolean processFound = procs.stream().filter(row -> row.indexOf(findProcess) > -1).count() > 0;

Java alkalmazás futásának ellenőrzése Windows rendszeren (parancssor):

wmic PROCESS where "name like '%java%'" get Processid,Caption,Commandline
CsatolmányMéret
Csomag ikon Homework4Execute.zip22.06 KB