2014-05-18 1 views
0

Я обматываю внешнюю программу 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) с небольшой длиной, но безрезультатно.

Как исправить эту проблему подвески?

Заранее спасибо :)

ответ

1

stdError.readLine() блокирует, пока не + - 4000 байт в потоке ошибок

Нет, это не делает. Он возвращается, как только появляется строка для чтения.

Что происходит в том, что процессисточника буферный его выхода,, очевидно, в 4096-байтовых куски. Вы ничего не можете сделать с концом Java.

+0

Интересно, как это тогда, что в фактической командной строке оно непрерывно печатается? –

+0

Поскольку 'stdio' не буферизуется, когда вывод является терминалом. – EJP

+0

Дело в том, что я уверен, что есть способ, поскольку существует еще одна программа с закрытым исходным кодом (написанная на языке C++, если это так), которая определенно содержит оболочки для рассматриваемой программы и способна обновлять текущие результаты. –