2012-06-11 56 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時,輸出將轉至固定大小的緩衝區。如果緩衝區填滿,則進程阻塞,直到緩衝區中的剩餘輸出空間爲止。所以如果緩衝區沒有清空,那麼進程就會掛起。

此外,如果您想了解該流程的某些過程出錯,那麼錯誤流可能包含實際有用的信息。

幾點建議:

  • 命名的String CH似乎誤解,因爲通道通常用於字符。
  • 我喜歡把從stderr讀取的代碼放在專用的工作線程中。這樣,在讀取輸入流和錯誤流之間切換會自動發生,而不必考慮它。
+0

謝謝澄清!所以我意識到,當我使用'getInputStream()'而不是'getErrorStream()'時,這也不起作用。這是否也取決於進程以及它用於輸出其數據的流? – KrispyDonuts

+0

@Ryan:約定是程序將標準輸出寫入標準輸出並將錯誤診斷信息寫入標準錯誤。所以你需要閱讀他們兩個。 –

+0

嗯,我明白了。感謝您的幫助@NathanHughes。 – KrispyDonuts

2

這真的取決於您正在執行的目標進程。

很多時候目標進程將直到流被消耗(目標進程的流緩衝器需要被倒掉)。所以,如果你沒有處理錯誤/輸出流,那麼目標進程可能會掛起,因爲它阻塞了流以排空。

+0

目標進程不會主動等待。相反,它會嘗試寫入其stdout或stderr,並被**阻塞**,因爲將進程連接到代碼的緩衝區/管道已滿。 –

+0

啊,我明白了。感謝您澄清suraj和stephen。 – KrispyDonuts

相關問題