Блокировка BufferedReader при чтении из process.getErrorStream()

Когда я запускаю этот код и граф вызовов действительно большой, программа печатает до последней строки, которую выводит 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();
}

person gruuuvy    schedule 29.03.2014    source источник


Ответы (1)


Вам нужно прочитать оба потока в отдельных потоках или объединить их, чтобы вы читали их оба одновременно. В противном случае процесс может заблокироваться, если выходные данные не будут использованы. В этом случае должен быть неиспользованный вывод в stdout, который блокирует процесс, что означает, что он не завершится, что означает, что он не закроет stderr,, что означает, что чтение stderr будет заблокировано.

person user207421    schedule 29.03.2014
comment
Пример чтения обоих потоков будет выглядеть точно так же, как пример чтения одного из них, как у вас уже было выше, только это произойдет дважды. Пример запуска потока вряд ли требуется. Пример вызова метода, объединяющего потоки, тоже вряд ли требуется, так как это всего одна строка, которая вызывает документированный API. Я предлагаю вам посмотреть его. - person user207421; 30.03.2014