2012-09-11 146 views
5

我通常使用java.lang.ProcessBuilder和java.lang.Process來運行外部命令行程序,並且它對於運行和完成命令正常工作。例如,這會在工作目錄下運行「myProgram」與參數「myArg」:從java運行交互式命令行應用程序

List<String> commandLine = new ArrayList<String>(); 
commandLine.add("myProgram"); 
commandLine.add("myArg"); 
ProcessBuilder builder = new ProcessBuilder(commandLine); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 

不過,說我想運行一個腳本或有交互式輸入程序或東西(它促使我更多的投入開始後)。我可以使用類似於上述代碼的Java來做到這一點,還是我需要一種不同的方法?還是有一些圖書館可以幫助我呢?

回答

4

根據the documentation您應該能夠重定向輸入和輸出流。這告訴它從父進程使用System.in/System.out

builder.redirectInput(ProcessBuilder.Redirect.INHERIT); 
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 

如果你想要寫的東西的過程的輸入:

如果源是Redirect.PIPE(初始值) ,那麼可以使用Process.getOutputStream()返回的輸出流來寫入子流程的標準輸入。如果源設置爲任何其他值,則Process.getOutputStream()將返回一個空輸出流。

+0

與標準輸入和標準輸出你的意思是System.in和System.out? – 11684

+0

@ 11684是的,我更新了答案。 –

+0

謝謝!一直在尋找這一點。 – dantiston

0

重定向stdin和stdout無疑是簡單命令行程序的一種選擇。

使用 「機器人」 類是另一種,如果你真正需要的腳本按鍵(例如,在測試腳本):

編寫一個調用Java程序並使用「<」和「>」重定向操作符的簡單.bat文件或shell腳本還沒有第三選擇。

這一切都取決於你在找什麼:)

+0

我基本上想通過確認提示強制執行一個沒有--force標誌或等效的程序。 – smcg

+0

你可以在shell腳本中運行程序嗎?如果「是」,那就足夠了嗎? – paulsm4

+0

這將是一個kludge。 – smcg