2012-06-11 3 views
4

Выполняю процесс, используя класс Process. Пройти через поток ошибок, кажется, необходимо для успешного выполнения процесса. Почему происходит поток ошибок, необходимый для правильной работы процесса? Есть ли что-то, что я делаю неправильно?Почему процесс getErrorStream() необходим для запуска процесса?

Process wkstdin = Runtime.getRuntime().exec(command); 
BufferedWriter wkstdin_writer = new BufferedWriter(
      new OutputStreamWriter(wkstdin.getOutputStream())); 
//write data 

Необходимые части Кодекса:

BufferedReader input = new BufferedReader(new InputStreamReader(
      wkstdin.getErrorStream())); 
String ch; 
while ((ch = input.readLine()) != null) 
{ 
    System.out.println(ch); 
} 
+0

О, не заметили, что сделают @skynorth. – KrispyDonuts

ответ

5

Когда процесс записывает в stderr, выход переходит в буфер фиксированного размера. Если буфер заполняется, процесс блокируется до тех пор, пока в буфере не останется место для оставшегося выхода. Поэтому, если буфер не пуст, процесс будет зависать.

Также, если что-то пойдет не так с процессом, о котором вы хотели бы узнать об этом, поток ошибок может содержать фактическую полезную информацию.

Некоторые предложения:

  • Именование строковое ч кажется, вводит в заблуждение, так как ч обычно используется для символов.
  • Мне нравится ставить код, который читается из stderr в выделенном рабочем потоке. Таким образом, переключение между чтением входного потока и потоком ошибок происходит автоматически без моего разрешения.
+0

Спасибо за разъяснение! Поэтому я понял, что это также не работает, когда я использую 'getInputStream()' вместо 'getErrorStream()'. Это также зависит от процесса и того, какой поток он использует для вывода своих данных? – KrispyDonuts

+0

@Ryan: соглашение предназначено для программ для записи их нормального вывода на stdout и записи информации об ошибках в stderr. поэтому вам нужно прочитать их обоим. –

+0

Хм, я понимаю. Спасибо за помощь @NathanHughes. – KrispyDonuts

2

Это действительно зависит от целевого процесса вы выполняете.

Много раз целевого процесс будет блока, пока потоки не потребляется (поток буферов целевого процесса в должны быть слиты). Поэтому, если вы не обрабатываете потоки ошибок/выходов, тогда целевой процесс может оказаться зависающим, поскольку он заблокирован для потока, который будет истощен.

+0

Целевой процесс не активно ждет. Скорее, он пытается записать его на stdout или stderr и ** заблокирован **, потому что буфер/канал, соединяющий процесс с вашим кодом, заполнен. –

+0

А, я вижу. Спасибо за разъяснение suraj и stephen. – KrispyDonuts

Смежные вопросы