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ány | Méret |
---|---|
Homework4Execute.zip | 22.06 KB |
- A hozzászóláshoz be kell jelentkezni