我正在编写一个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的调用实际上会无限期地挂起。但是,我想使我的代码通用,以便它适用于所有情况。如何修改我的代码以实现相同的目的。

问候,
开发人员

最佳答案

这是一个较晚的答复,但问题尚未真正解决,它在某些搜索的第一页上。我也遇到了同样的问题,BufferedReader.ready()仍然会锁定它。

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

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

下面是一些伪代码:

File thisFile = new File(“somefile.ext”);
ProcessBuilder pb =新的ProcessBuilder(yourStringList);
pb.redirectError(thisFile);
进程p = pb.start();
p.waitFor();
p.destroyForcfully();
ArrayList fileContents = getFileContents(thisFile);

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

10-07 19:28