我正在编写一个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的调用实际上会无限期挂起。但是,我想让我的代码通用,以便适用于所有场景。如何修改我的代码以实现相同目的。
此致 开发
答案 0 :(得分:2)
readline()
是一个阻止通话。它将阻塞,直到有一行要读取(由行尾字符终止)或底层流关闭(返回EOF)。
您需要拥有检查BufferedReader.ready()
或仅使用BufferedReader.read()
的逻辑,并且如果您决定等待足够长时间(或想要做其他事情然后再次检查),则需要挽救。
编辑添加:就是说,它不应该“无限期”挂起;一旦被调用的进程终止,它就应该返回。您调用的进程是否也输出了stdout
的内容?如果是这种情况......你也需要从中读取或缓冲区将填充并阻止外部进程,这将阻止它退出...导致你的问题。
答案 1 :(得分:1)
这是一个迟到的回复,但问题并没有真正解决,而且它在某些搜索的第一页上。我遇到了同样的问题,而BufferedReader.ready()
仍然会设置锁定的情况。
如果您需要获取持久流,则以下解决方法将无效。但是,如果你只是运行一个程序并等待它关闭,这应该没问题。
我使用的解决方法是致电ProcessBuilder.redirectError(File)
。然后,我将读取该文件并使用该文件向用户显示错误流。它工作正常,没有锁定。我在Process.waitFor()之后调用了Process.destroyForcibly()
,但这可能是不必要的。
下面有一些伪代码:
File thisFile = new File("somefile.ext"); ProcessBuilder pb = new ProcessBuilder(yourStringList); pb.redirectError(thisFile); Process p = pb.start(); p.waitFor(); p.destroyForcibly(); ArrayList fileContents = getFileContents(thisFile);
我希望这对至少一些用例有帮助。