Я обматываю внешнюю программу Windows, которая обновляет ее прогресс, многократно нажимая новые строки в поток ошибок.Явный внешний поток ошибок процесса readLine() блокирует прерывисто
Командная строка выглядит примерно так, когда он работает:
10% done
10% done
11% done
и так далее.
Я с некоторым успехом захватывая это в моем Java-приложение Thusly:
Process process = Runtime.getRuntime().exec("my little command");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while((s = stdError.readLine())!=null)
{
System.out.println(s);
}
К сожалению, как вы уже догадались, есть небольшая проблема. Блоки stdError.readLine()
до тех пор, пока в потоке ошибок не будет + 4000 байт, и только затем распечатывает каждую строку в быстрой сессии, прежде чем она снова зависает.
Я попытался изменить размер буфера BufferedReader
и использовать stdError.read(char [] cbuf, int off, int len)
с небольшой длиной, но безрезультатно.
Как исправить эту проблему подвески?
Заранее спасибо :)
Интересно, как это тогда, что в фактической командной строке оно непрерывно печатается? –
Поскольку 'stdio' не буферизуется, когда вывод является терминалом. – EJP
Дело в том, что я уверен, что есть способ, поскольку существует еще одна программа с закрытым исходным кодом (написанная на языке C++, если это так), которая определенно содержит оболочки для рассматриваемой программы и способна обновлять текущие результаты. –