2012-06-29 53 views
0

我正在用Java編寫一個程序,它將命令發送到C程序並讀取其輸出,但是當我嘗試實際讀取輸出時發現它掛起。 的代碼是:當從C程序讀取輸出時,BufferedReader掛起

import java.io.*; 
    public class EsecutoreC { 
     private String prg; 
     OutputStream stdin=null; 
     InputStream stderr=null; 
     InputStream stdout=null; 
     BufferedReader br; 
     Process pr; 
     public EsecutoreC(String p){ 
      prg=p; 
      try { 
       pr=Runtime.getRuntime().exec(prg); 
       stdin=pr.getOutputStream(); 
      stderr=pr.getErrorStream(); 
      stdout=pr.getInputStream(); 
        br=new BufferedReader(new InputStreamReader(stdout)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    public void sendInput(String line){ 
     line=line+"\n"; 
     try { 
      stdin.write(line.getBytes()); 
      stdin.flush(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 

} 
public BufferedReader getOutput(){ 
    return br; 
} 
} 

當我需要閱讀程序的輸出,我只是用getOutput得到的BufferedReader,然後我打電話的readLine()。我看到程序掛起,因爲我在readLine調用之後放置了println,並且沒有打印任何內容。我還在C程序的每行輸出之後添加\ n。 另外,有沒有辦法顯示通過Runtime.getRuntime()。exec()調用的程序的窗口?這樣當我向它發送字符串或從輸出讀取數據時,我可以檢查是否還有其他問題。

+1

在C程序中嘗試一些fflush(stdout)?如果沒有發送到終端,輸出可能不會被行緩衝。 –

+0

試過了,沒有工作。它可能與編碼有關嗎? – Orgrim

+0

如果你調用br.ready(),會發生什麼?當它返回true時,應該有用於閱讀的數據。 – Nick

回答

0

當您撥打readLine()時,BufferedReader將被阻塞,直到輸出中出現新行字符'\n'。嘗試從終端/命令行調用C程序,看看輸出是否真的以新行結束。

或者,您可以只需一個字符read(1)(一次不需要BufferedReader),然後立即打印。

編碼不會影響'\n'字符。

+0

是的,我爲C程序輸出的每一個字符串附加一個'\ n',並從終端正常工作。我不認爲read()也可以工作,因爲正如我上面所說的,ready()返回false。 – Orgrim

相關問題