ProcessBuilder:在不阻塞主线程的情况下转发已启动进程的stdout和stderr

11 浏览
0 Comments

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();

虽然这种方法有点可行,但感觉有点不太好。而且,这还给我增加了一个需要正确管理和终止的线程。有没有更好的方法来做到这一点?

0