我正在使用ProcessBuilder在Java中构建一个流程,如下所示:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
现在我的问题如下:我想捕获通过该进程的stdout和/或stderr进行的操作,并将其System.out
异步重定向到。我希望该过程及其输出重定向在后台运行。到目前为止,我发现做到这一点的唯一方法是手动产生一个新线程,该线程将不断读取stdOut
并调用适当的write()
方法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();
虽然这种方法行得通,但感觉有点脏。最重要的是,它为我提供了另外一个线程来正确管理和终止。有什么更好的方法吗?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);