Ich mag ja Bash. Auch, weil man dort einfach alles kombinieren kann, was auf dem System liegt. Bei echten Sprachen wie Java geht das dann plötzlich nicht mehr so einfach, bei Java ist es sogar besonders kompliziert.
Aufrufen
Der Aufruf selbst ist gar nicht so ganz absurd. Lässt man das Fangen der Exceptions weg sieht es so aus:
Process child = Runtime.getRuntime().exec(command);
child.waitFor();
Ein eigener Prozess mit dem Systembefehl wird gestartet, auf den dann gewartet wird. Nur reicht das nicht.
Ausgabe fangen
Mit obigem Code läuft der Prozess eine Weile und stirbt dann. Denn es müssen die Ausgaben abgefangen werden. Das ist zwar völlig bescheuert und ich wollte es erst auch nicht glauben, aber es ist wirklich so. Dann sieht es so aus:
Process child = Runtime.getRuntime().exec(command);
StreamGobbler errorGobbler = new StreamGobbler(child.getErrorStream(), "ERROR");
StreamGobbler outputGobbler = new StreamGobbler(child.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();
child.waitFor();
StreamGobbler ist dabei eine von Java World kopierte Klasse, die nichts anderes macht als in einem Thread die Ausgaben zu fangen:
class StreamGobbler extends Thread {
InputStream is;
String type;
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ( (line = br.readLine()) != null) {
System.out.println(type + ">" + line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}