2012-03-28 335 views
0

我必須寫下一些運行外部進程的java代碼。 該過程從stdin獲取輸入行,並在stdout上提供輸出行。Java在運行bash命令時輸入並獲取輸出

我寫的代碼如下

try 
{    
    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec("./" + args[0]); 
    Process proc2 = rt.exec(c); 
    int exitVal = proc2.exitValue(); 
    System.out.println("Process exitValue: " + exitVal); 
} 
catch (Throwable t){ 
} 

凡ARGS [0]是在外部處理,而c是我需要饋送到過程輸入(字符串)。如果它運行正常,我會得到一個exitVal = 0,而不是我什麼都沒有得到。另外,我真正想要打印的是外部過程的輸出(在給出的例子中將是「6」)。

+0

'趕上(的Throwable T){}'...從來沒有做到這一點http://www.javapractices.com/topic/TopicAction .do?Id = 16 – artbristol 2012-03-28 12:56:41

回答

0

你不能「無所得」。方法exitValue()返回原始類型,因此它甚至不能爲空。但是這種方法可能會卡住。發生這種情況是因爲您的進程仍在運行。

它可能是運行,因爲你沒有「喂」它?在這種情況下,您唯一需要做的就是致電proc2.getOutputStream()並將您需要的內容寫入此流。如果你想讀取進程的輸出使用proc2.getInputStream()並從流中讀取。

順便說一句,看看ProcessBuilder。它提供了更好,更「面向對象」的API,簡單的Runtime.exec()

+0

謝謝您的回覆!使用ProcessBuilder仍然沒有成功:/問題依然存在......可執行文件的工作方式是:運行它(Enter),然後等待一個字符串(輸入字符串 - > Enter)。它基本上是一個過程中,我只需要一種方法讓這個過程知道它正在等待stdin。 – 2012-03-29 11:07:52

2

您必須使用getInputStream()getOutputStream()進行通信,請參閱javadocs

如果您不讀取進程中的所有數據,則可能會掛起甚至死鎖。有關常見問題的簡短介紹,請參見this blog post。至少,您應該讀取過程輸出中的所有數據。

0

你可以喂以 '<' 重定向程序輸入:

{ 
    Process p = Runtime.getRuntime().exec("wc < pom.xml"); 
    p.waitFor(); 
    System.out.println(p.exitValue()); 
    BufferedReader bri = new BufferedReader 
    (new InputStreamReader(p.getInputStream())); 
    String line; 
    while ((line = bri.readLine()) != null) { 
    System.out.println(line); 
    } 
    bri.close(); 
} 
+0

謝謝您的回覆!事情是我不想餵我的可執行文件,但一個字符串。 – 2012-03-29 10:59:12

+1

您可以查看[this](http://www.rgagnon.com/javadetails/java-0014.html) – wytten 2012-03-29 18:51:22