2010-08-17 147 views
3

我想用apache commons exec運行交互命令。除了當我的命令被執行並等待用戶輸入時,除了當我按下回車使其無法使用時,我在控制檯中看不到我的輸入時,一切都可以正常工作。用apache commons運行交互命令exec

這是一個互動節目的一個例子:

public static void main(String[] args) { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String line = null; 
     while (true) { 
      System.out.print("=> "); 
      try { 
       line = in.readLine(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println(line); 
     } 
    } 

現在我想執行一個與Apache公地高管是這樣的:

public static void main(String[] args) { 
    Executor ex = new DefaultExecutor(); 
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in)); 
    CommandLine cl = new CommandLine("java"); 
    cl.addArguments("-cp target\\classes foo.bar.Main"); 

    try { 
     ex.execute(cl); 
    } catch (ExecuteException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

正如我所說的,它基本上是工作,我得到「=>」提示符,但是當我鍵入一些東西時,我纔看到它,直到我按下回車鍵。我在Windows 7上使用cmd提示符執行此操作。 我很感激任何關於如何達到預期行爲的提示。

編輯:它按預期在linux上工作。我想這是Windows cmd提示符的問題。如果可能的話,我仍然希望能夠做到這一點,所以我希望能夠深入瞭解Windows上的這種行爲。

Edit2:我也用msys shell和powershell測試過,都表現出同樣的問題。

Edit3:我通過啓動一個單獨的cmd提示來解決這個問題。這工作,但我仍然想知道爲什麼。

CommandLine cl = new CommandLine("cmd"); 
cl.addArguments("/C java -cp target\\classes foo.bar.Main"); 

感謝

拉烏爾

回答

2

我不知道到底是什麼您期望在這裏發生;如果產生的過程被設計爲等待從其輸入中讀取,那麼當它完成時它應該不會令人驚訝嗎?

如果這是問題,並且您的問題是「我如何讓我的程序自動發送換行符到生成的進程的輸入?」,那麼您需要定義一個OutputStream來寫入輸入,並且請抓住ExecuteStreamHandler將其附加到流程中。類似以下內容:

Executor ex = new DefaultExecutor(); 

// Create an output stream and set it as the process' input 
OutputStream out = new ByteArrayOutputStream(); 
ex.getStreamHandler().setProcessInputStream(out); 
... 
try 
{ 
    ex.execute(cl); 
    out.write("\n".getBytes()); // TODO use appropriate charset explicitly 
... 
+0

謝謝,但不幸的是,這不是我想要的。我想在輸入內容的時候在我的cmd提示符下得到反饋,而我不知道。當我運行我的例子時,我得到了「=>」提示符,但是當我鍵入一些東西時,它不可見。它顯示出來,當我按下輸入雖然。此外,執行阻塞,直到產生的進程退出,所以我不知道你的例子會做什麼不同的事情?! – 2010-08-17 17:28:01

+0

這並不回答他的問題。 – 2016-06-17 00:58:51

0

使用Apache exec org.apache.commons.exec.DefaultExecuteResultHandler可以啓動非阻塞命令。然後你可以按照@Andrzej提到的步驟行事。