2015-02-10 71 views
0

我想從一個Java應用程序運行一個.exe文件,並希望能夠使用它(現在)像一個終端,在那裏我可以寫入.exe然後回讀它,然後再次寫入。如果BufferedWriter仍然打開,爲什麼BufferedReader會失敗?

我的問題是隻有在讀取器試圖從輸入流讀取之前關閉寫入器時,該代碼才起作用。

String line = "", prev = ""; 
    Scanner scan = new Scanner(System.in); 

    ProcessBuilder b = new ProcessBuilder("myexe"); 
    b.redirectErrorStream(true); 

    Process p = b.start(); 
    OutputStream stdin = p.getOutputStream(); 
    InputStream stdout = p.getInputStream(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); 


    System.out.println ("->"); 
    while (scan.hasNext()) { 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 
     String input = scan.nextLine(); 
     if (input.trim().equals("exit")) { 
      writer.write("C"); 
     } else { 
      writer.write(input); 
     } 
     writer.flush(); 

     //writer.close(); 
     while ((line = reader.readLine()) != null) { 
      System.out.println ("[Stdout] " + line); 

      if (line.equals(prev)){ 
       break; 
      } 
      prev = line; 
      } 
      reader.close(); 
     } 

所以我的問題是,我在做ProcessBuilder的錯誤嗎?我已閱讀有關不正確讀取輸出可能導致系統掛起。但是這並不能解釋爲什麼當作家仍然開放時它會掛起?

+0

子進程可能正在等待行尾字符。 – 2015-02-10 23:09:22

+0

我的確想到了這一點,並添加並測試了「\ n」「%n」「\ r \ n」到發送到寫入緩衝區的字符串,仍然是同樣的事情......是否有另一種方法呢? – 2015-02-11 09:22:08

回答

1

這個問題實際上與我的C編譯.exe。在運行時,應用程序正在打印輸出,因此在cmd終端中工作,但是在發送每個命令後我沒有刷新緩衝區。一旦我完成了這個任務,Java應用程序就會在發送它們時識別每個命令。

相關問題