java - 从进程中读取错误流

标签 java process io stream java-io

我正在编写一个 java 程序来从进程中读取错误流。下面是我的代码结构——

ProcessBuilder probuilder = new ProcessBuilder( command );              
Process process = probuilder.start(); 
InputStream error = process.getErrorStream();
InputStreamReader isrerror = new InputStreamReader(error);
BufferedReader bre = new BufferedReader(isrerror);
while ((linee = bre.readLine()) != null) {
        System.out.println(linee);
    }

如果实际上有任何内容写入被调用进程的错误流,则上述代码可以正常工作。但是,如果没有任何内容写入错误流,那么对 readLine 的调用实际上会无限期地挂起。但是,我想让我的代码通用,以便它适用于所有场景。我怎样才能修改我的代码以实现相同的目的。

问候, 开发

最佳答案

readline() 是一个阻塞调用。它将阻塞直到有一行要读取(由行尾字符终止)或底层流关闭(返回 EOF)。

您需要具有检查 BufferedReader.ready() 或仅使用 BufferedReader.read() 的逻辑,如果您认为等待时间足够长则退出(或者想做其他事情然后再检查)。

编辑添加:话虽这么说,它不应该“无限期地”挂起;一旦调用的进程终止,它应该返回。有没有可能你调用的进程也在向 stdout 输出一些东西?如果是这种情况......你也需要从中读取,否则缓冲区将填满并阻止外部进程,这将阻止它退出......导致你的问题。

关于java - 从进程中读取错误流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12908732/

相关文章:

java - 在多个资源请求的情况下恢复更改的最佳做法是什么?

java - 如何在 JSF 2.2 中实现加载页面

java代码显示PC上当前打开的进程

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 加载并保存到txt文件

.net - Task.Factory.FromAsync 和 RegisterWaitForSingleObject - 后者不会扼杀前者的用处吗?

java - primefaces 3.2 菜单项错误

java - 如何: Async Callbacks using SOAP/REST Web Services with Java

c - 使用管道来读取和写入。程序编译但没有输出。为什么?

c - 在 main 中等待 execvp