Ich erstelle einen Prozess in Java mit ProcessBuilder wie folgt:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Jetzt ist mein Problem das Folgende: Ich möchte erfassen, was durch stdout und / oder stderr dieses Prozesses läuft, und es System.out
asynchron umleiten . Ich möchte, dass der Prozess und seine Ausgabeumleitung im Hintergrund ausgeführt werden. Bisher habe ich nur die Möglichkeit gefunden, manuell einen neuen Thread zu erstellen, der kontinuierlich aus liest stdOut
und dann die entsprechende write()
Methode von aufruft System.out
.
new Thread(new Runnable(){
public void run(){
byte[] buffer = new byte[8192];
int len = -1;
while((len = stdOut.read(buffer)) > 0){
System.out.write(buffer, 0, len);
}
}
}).start();
Während dieser Ansatz funktioniert, fühlt er sich ein bisschen schmutzig an. Und obendrein gibt es mir noch einen Thread, den ich richtig verwalten und beenden kann. Gibt es einen besseren Weg, dies zu tun?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);