ProcessBuilder:在不阻塞主线程的情况下转发已启动进程的stdout和stderr
- 论坛
- ProcessBuilder:在不阻塞主线程的情况下转发已启动进程的stdout和stderr
11 浏览
ProcessBuilder:在不阻塞主线程的情况下转发已启动进程的stdout和stderr
我正在使用Java中的ProcessBuilder构建一个进程,代码如下:
ProcessBuilder pb = new ProcessBuilder() .command("somecommand", "arg1", "arg2") .redirectErrorStream(true); Process p = pb.start(); InputStream stdOut = p.getInputStream();
现在我的问题是:我想捕获通过stdout和/或stderr传递的任何内容,并将其异步重定向到System.out
。我希望进程及其输出重定向在后台运行。到目前为止,我唯一找到的方法是手动创建一个新线程,该线程将持续从stdOut
中读取,然后调用System.out
的适当write()
方法。
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();
虽然这种方法有点可行,但感觉有点不太好。而且,这还给我增加了一个需要正确管理和终止的线程。有没有更好的方法来做到这一点?