2012-12-10 158 views
0

在JAVA中使用ProcessBuilder我能夠運行簡單的終端命令,如ls,pwd,echo等..等等...... 但是下面的代碼正在終止,don不知道爲什麼?無法運行java程序中的特定終端命令(Eclipse)

public static void main(String[] args) throws Exception 
{ 
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini"); 
    p.waitFor(); 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = ""; 
    while ((line = b.readLine()) != null) 
    { 
     System.out.println(line); 
    } 
} 

該命令在終端上運行良好,大約需要15秒才能運行並輸出。 我已經經歷了類似的話題在stackoverflow但沒有找到任何幫助。 請在這方面提供幫助。 在此先感謝。

+0

'但是下面的代碼正在終止'...什麼是你得到的異常或錯誤? – Azodious

回答

0

考慮監視InputStream和ErrorStream。有可能輸出可能會寫入ErrorStream,這就是爲什麼你看不到任何顯示。

Here's a good example來自Javaworld有關Runtime.exec()的一些常見缺陷以及如何使用它的說明。


我錯過了它在你的代碼中的第一個外觀,但這裏有一個提示,你可能會做錯了什麼:

因爲有些本機平臺僅針對 標準輸入和輸出流提供有限的緩衝區大小,未及時寫輸入 流或讀取子流程的輸出流可能導致 子流程阻塞,甚至死鎖。

考慮更新了自己的代碼沿着這些線路:

public static void main(String[] args) throws Exception 
{ 
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini"); 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = ""; 
    while ((line = b.readLine()) != null) 
    { 
     System.out.println(line); 
    } 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    String line = ""; 
    while ((line = b.readLine()) != null) 
    { 
     System.out.println(line); 
    } 

    p.waitFor(); 
} 

注:我建議創建的線程來處理顯示從InputStream和errorstream您的輸出在我上面貼的例子鏈接。

+0

好的我會嘗試你在說什麼......但是爲什麼它會在2-3秒內終止......它應該運行~15秒。 – saj1919

+0

@ saj1919:好吧,我猜你會遇到某種異常,這就是爲什麼這個過程沒有按照你想要的方式行事。我之所以建議你監視錯誤流的原因之一也是如此 – Sujay

+0

現在我嘗試了這一點,但仍然得到相同的結果..終止b =新的BufferedReader(新的InputStreamReader(p.getErrorStream())); \t \t line =「」; \t \t而((線= b.readLine())!= NULL) \t \t { \t \t的System.out.println(線); \t \t} – saj1919

2

請參閱該代碼,這可能幫助ü....使用bash.Just用echo命令替換您的命令

的ProcessBuilder B =新的ProcessBuilder( 「慶典」, 「 - C」, 「回聲ABC」);

Process termProc = null; 

    try { 
     termProc = b.start(); 
     BufferedReader stdInput = new BufferedReader(new 
     InputStreamReader(termProc.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new 
     InputStreamReader(termProc.getErrorStream())); 

     String s = null; 
     while ((s = stdInput.readLine()) != null) 
     { 
      System.out.println(s); 


     } 
     while ((s = stdError.readLine()) != null) 
     { 

      System.out.println(s); 

     } 

    } catch (IOException e) { 

     e.printStackTrace(); 
    }