首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ProcessBuilder:在不阻塞主线程的情况下转发已启动进程的标准输出和标准错误

ProcessBuilder:在不阻塞主线程的情况下转发已启动进程的标准输出和标准错误
EN

Stack Overflow用户
提问于 2013-01-05 05:46:09
回答 12查看 119.9K关注 0票数 100

我正在使用ProcessBuilder在Java中构建一个进程,如下所示:

代码语言:javascript
运行
复制
ProcessBuilder pb = new ProcessBuilder()
        .command("somecommand", "arg1", "arg2")
        .redirectErrorStream(true);
Process p = pb.start();

InputStream stdOut = p.getInputStream();

现在我的问题如下:我希望捕获该进程的标准输出和/或标准错误,并将其异步重定向到System.out。我希望进程及其输出重定向在后台运行。到目前为止,我找到的唯一方法是手动生成一个新线程,该线程将不断地从stdOut读取数据,然后调用System.out的适当write()方法。

代码语言:javascript
运行
复制
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();

虽然这种方法行得通,但感觉有点脏。最重要的是,它给了我另一个线程来管理和正确终止。有没有更好的方法来做到这一点?

EN

Stack Overflow用户

发布于 2015-10-02 01:21:43

默认情况下,创建的子进程没有自己的终端或控制台。它的所有标准I/O操作(即stdin、stdout、stderr)都将被重定向到父进程,在父进程中可以通过使用方法getOutputStream()、getInputStream()和getErrorStream()获得的流来访问它们。父流程使用这些流将输入提供给子流程并从子流程获取输出。由于一些本机平台仅为标准输入流和输出流提供有限的缓冲区大小,因此未能及时写入输入流或读取子进程的输出流可能会导致子进程阻塞,甚至死锁。

https://www.securecoding.cert.org/confluence/display/java/FIO07-J.+Do+not+let+external+processes+block+on+IO+buffers

票数 -2
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14165517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档