从process.getErrorStream()读取时BufferedReader阻塞

时间:2014-03-29 22:50:00

标签: java bufferedreader inputstreamreader

当我运行此代码且调用图非常大时,程序将打印到opt输出的最后一行,并在readLine处被阻止,即使没有任何内容。谁知道问题是什么? opt -print-callgraph file将调用图发送到错误流。我尝试执行opt -print-callgraph file 2> callgraph以便我可以从文件中读取,但它会抱怨位置参数太多。

奇怪的是,对于尺寸较小的调用图,代码运行良好。

我也尝试使用ProcessBuilder,但我遇到了同样的问题。

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("opt -print-callgraph " + file);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s = null;
try {
    // Gets stuck at readLine after printing out the last line.
    while ((s = in.readLine()) != null) {
        System.out.println(s);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    in.close();
}

1 个答案:

答案 0 :(得分:2)

您需要在单独的线程中读取这两个流,或者合并它们,以便您同时读取它们。否则,如果输出未消耗,则进程可以阻止。在这种情况下,stdout中必须有未消耗的输出阻止该过程,这意味着它不会完成,这意味着它不会关闭stderr,,这意味着读取{{1}将阻止。