2011-08-16 29 views
1

對於java,我是新手。我想從java中啓動的進程讀取stdout。我在谷歌搜索下面的代碼:「BufferedReader.ready」與「while(BufferedReader.readLine()!= null)」

Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec(args); 
    BufferedReader br = new BufferedReader(
     new InputStreamReader(proc.getInputStream())); 
    while(br.ready()){ 
      System.out.println(br.readLine()); 
    } 

但是,此代碼不打印輸出過程中(比如,LS)應該產生(順便說一句,我是在Linux上,OpenJDK的1.6)

但是,如果我改變while循環:

String line; 
    while((line = br.readLine())!=null){ 
      System.out.println(line); 
    } 

它按預期工作。

以前的代碼有什麼問題?根據java api doc的說法,我認爲它們是相似的。

+0

編輯第一個代碼塊,以反映實際代碼 – Santanu

回答

5

在上一個循環中,您只是在就緒狀態上循環,而不是從流中讀取任何字節。

+0

是否意味着第一個循環是無限的,因爲br.ready()總是返回true?在代碼的第一個片段中,如果我聲明瞭String line = null和while(line == br.ready()){System.out.println(line); if(line == null)break; } 是對的? –

+0

循環進入無限狀態的可能性很高。但是,如果第一次調用'br.ready()'返回一個'false',則循環將退出。我相信在這裏就是這種情況。另外,你不能像你所顯示的那樣將'String'等同於一個布爾值。請記住'ready()'返回一個'boolean'。 – adarshr

+0

甚至不清楚第一個循環中的'line'來自何處 –

0

當您到達ready()測試時,該命令尚未產生任何輸出,並且它返回false,立即結束循環。

您的第二個代碼的工作原因是readLine()調用塊直到它讀取整行。如果沒有進一步的控制,這種代碼的輸出是不可預測的,因爲它取決於命令產生的輸出量和完成所需的時間。

這是一個非常簡單的場景,所以它適用於大多數時間,但它不是一般可以應用的解決方案。

相關問題