2016-06-28 67 views
3

我有一個EXE文件,addOne.exe它連續地獲取控制檯來自用戶的整數輸入(NOT命令行參數)整數+ 1輸出到控制檯。以下示例輸出所示:如何從Java程序連續輸入到EXE的控制檯?

1 
2 

6 
7 

29 
30 
... 

我已經取得了EXE輸出工作,即,每當EXE輸出文本到控制檯,打印從Java程序文本。 我想:

  • 使用Scanner.nextInt(),並輸入到EXE爲控制檯輸入
  • 我需要在同一時間發送輸入一個Java程序,這意味着獲取用戶輸入只需在程序結束時關閉BufferedWriter流,並立即將流輸入到EXE中就行不通。

目前,我有以下代碼:

Process process = Runtime.getRuntime().exec("D:\\addOne.exe"); 
... 
Scanner keyboard = new Scanner(System.in); 
String input = ""; 
OutputStream stdin = process.getOutputStream(); 
while (!input.equals("exit")) { 
    try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin))) { 
     input = keyboard.nextLine(); 
     writer.write(input); 
    } catch (IOException ex) { 
     Logger.getLogger(CmdLineTest.class.getName()).log(Level.SEVERE,null,ex); 
    } 
} 

但是,每當我運行此代碼,while循環的第一次迭代(我第一次輸入的東西)是能夠發送輸入到EXE,但是在第一次迭代之後,給出了錯誤java.io.IOException: Stream Closed

我怎麼能繼續得到while循環

謝謝內從Scanner.nextInt()用戶輸入。


編輯:writer.flush()似乎輸入不會對用戶輸入從Java程序的EXE。


編輯:見下文

+2

移動作家建設循環之前。 – khelwood

+0

@khelwood儘管我在while循環的第一次迭代後仍然得到相同的錯誤,因爲我在每次迭代時都關閉了OutputStream。 如果我在while循環的每次迭代中都不關閉OutputStream,那麼java程序不會將來自java程序的輸入輸出到EXE。 – Squidiemeister

+0

每次迭代都不要關閉流。你可以沖洗它而不關閉。爲什麼你的* Out * putStream變量被稱爲'stdin'? – khelwood

回答

0

似乎使用writer.flush()輸入的流入EXE,但流所需的writer.newLine()之前由EXE處理的輸入,作爲控制檯需要輸入鍵在輸入後按下。

這裏是工作代碼:

while (true) { 
    try { 
     input = keyboard.nextLine(); 
     writer.write(input); 
     System.out.println("IN: "+input); 
     writer.newLine(); 
     writer.flush(); 
    } catch (IOException ex) { 
     Logger.getLogger(CmdLineTest.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
0

開啓你的trywhile報表範圍我的回答讓你只讓1 BufferedWriter。當您的資源嘗試代碼塊結束時,作者將被關閉,並延伸至stdin。因此,沒有更多的作家可以爲此目的而製作。

try([resources]) { 
    while([condition]) { 
     ... 
    } 
} catch(IOException ex) { 
    ... 
} 
+0

如果我不關閉我的作家,那麼OutputStream不會輸出從java程序到EXE的輸入... – Squidiemeister

+0

在while循環結束之前添加'writer.flush()'。 – Zircon

+0

writer.flush()似乎沒有將OutputStream和BufferedWriter輸出到EXE。另外,我需要在while循環的每次迭代中將輸出發送到EXE,而不是在while循環的末尾。 – Squidiemeister

相關問題