我正在编写一个 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/