Sto costruendo un processo in Java usando ProcessBuilder come segue:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Ora il mio problema è il seguente: vorrei catturare tutto ciò che sta attraversando stdout e / o stderr di quel processo e reindirizzarlo in System.out
modo asincrono. Voglio che il processo e il suo reindirizzamento dell'output vengano eseguiti in background. Finora, l'unico modo che ho trovato per farlo è generare manualmente un nuovo thread che leggerà continuamente stdOut
e quindi chiamerà il write()
metodo appropriato di 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();
Anche se questo tipo di approccio funziona, sembra un po 'sporco. E per di più, mi dà un altro thread da gestire e terminare correttamente. C'è un modo migliore per farlo?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);