【问题标题】:Reading error stream from a process从进程中读取错误流
【发布时间】:2012-10-06 04:49:01
【问题描述】:

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

问候, 开发

【问题讨论】:

    标签: java process io stream java-io


    【解决方案1】:

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

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

    编辑添加:话虽如此,它不应该“无限期地”按原样挂起;一旦调用的进程终止,它应该返回。您调用的进程是否也会向stdout 输出一些内容?如果是这种情况......您也需要从中读取,否则缓冲区将填满并阻止外部进程,这将阻止它退出......导致您的问题。

    【讨论】:

      【解决方案2】:

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

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

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

      下面的一些伪代码:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 2010-10-27
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多