从进程中读取错误流

use*_*934 5 java io process 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

问候,开发

小智 3

这是一个迟到的回复,但问题还没有真正解决,而且它出现在一些搜索的首页上。我遇到了同样的问题,并且BufferedReader.ready()仍然会设置一个会锁定的情况。

如果您需要获取持久流,则以下解决方法将不起作用。但是,如果您只是运行一个程序并等待它关闭,那么这应该没问题。

我使用的解决方法是调用ProcessBuilder.redirectError(File). 然后我读取该文件并使用它向用户呈现错误流。效果很好,没有锁。我确实Process.destroyForcibly()在 Process.waitFor() 之后调用了,但这可能是不必要的。

下面是一些伪代码:

    文件 thisFile = new File("somefile.ext");
    ProcessBuilder pb = new ProcessBuilder(yourStringList);
    pb.redirectError(thisFile);
    进程 p = pb.start();
    p.waitFor();
    p.destroyForcously();
    ArrayList fileContents = getFileContents(thisFile);

我希望这至少对您的一些用例有所帮助。