Estou construindo um processo em Java usando ProcessBuilder da seguinte maneira:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Agora, meu problema é o seguinte: Eu gostaria de capturar tudo o que está passando por stdout e / ou stderr desse processo e redirecioná-lo de System.out
forma assíncrona. Quero que o processo e seu redirecionamento de saída sejam executados em segundo plano. Até agora, a única maneira que encontrei de fazer isso é gerar manualmente um novo thread que lerá continuamente stdOut
e chamará o write()
método apropriado de 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();
Embora essa abordagem funcione, parece um pouco suja. E, além disso, me dá mais um thread para gerenciar e encerrar corretamente. Existe alguma maneira melhor de fazer isso?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);