2014-05-23 26 views
-2

執行命令我試圖從執行Java程序的腳本:從Java

public class TestCommandLine 
{ 
    public static void main (String[] args) 
    { 
     String PATH = "/path/programs/"; 
     String command = PATH + "name_programs param1 param2"; 
     executeCommand (command); 
    } 

    private static String executeCommand (String command) 
    { 
     StringBuffer output = new StringBuffer(); 
     String line = ""; 
     Process p; 

     try { 
      p = Runtime.getRuntime().exec (command); 
      p.waitFor(); 
      BufferedReader reader = new BufferedReader (new InputStreamReader (p.getInputStream())); 


      while ((line = reader.readLine()) != null) { 
       output.append (line + "\n"); 
      } 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return output.toString(); 
    } 
} 

沒有錯誤,但程序不運行。我也嘗試其他解決方案,從計算器,但他們都沒有工作

+0

以一些用於調試的語句開始(或者通過適當的調試程序進行操作)。首先打印出命令字符串。如果你複製粘貼字符串,它是否可以在cmd行手動工作?你也調用'executeCommand',但不捕獲返回字符串。那個字符串是由什麼組成的?你怎麼確定程序不運行?預期的行爲是什麼? – scrappedcola

+0

已經完成。我已經在控制檯中輸出了我的命令,將它複製並粘貼到命令行中,該命令正確工作 – Modfoo

+0

檢查exitValue和getErrorStream()的內容。這就是錯誤會被指出的​​地方。 – OrangeDog

回答

-1

我已經做到了我以前用過這樣的事情只有一次:

Process p = Runtime.getRuntime().exec("foo.exe"); 

你試過了嗎?如果是這樣,你回來的錯誤是什麼?

+0

「executeCommand(String command)」方法包含你寫的函數。我也不例外。我沒有錯誤 – Modfoo

-1

你的命令是生產,你想讀的輸出,但是你拒絕,直到命令完成生產這一切,並已退出閱讀它的任何(後waitFor()沒有要求getInputStream()直到)。

如果你的命令沒有產生太多的輸出,這是好的,Java可以緩衝它。但是,如果您的命令產生大量輸出,則Java無法將其全部緩衝,並且命令被阻止。

操作系統不會讓命令再寫輸出,因爲Java的緩衝區已滿,並且您尚未指示Java將其清空。所以該程序被阻止,Java的waitFor()將永不回頭。

解決您的問題,從exec()得到Process對象回來後馬上你應該調用getInputStream(),你應該創建一個新的Thread是負責讀取指令輸出到您的StringBuffer

然後,您應該完成進程waitFor(),看看它是否成功退出,然後您可以等待該線程到達輸入流的末尾並完成 - 此時,可以安全地讀取StringBuffer與您的命令的完整輸出。

0

如果您已經給出了實際的命令,那麼這會更快。

您不能使用Process.exec運行shell解釋的命令。相反,它直接執行程序。因此輸入/輸出重定向(|,>等)是不可能的。 如果你實際讀取stderr(getErrorStream())輸出,它可能會沿着「無效參數:>」的行。

你要麼必須:

  • 重定向Java中的輸出。從進程的stdout(getInputStream())讀取並寫入某種FileOutputStream。
  • 直接執行shell而不是命令。例如/bin/sh -c "command arg > file"。所引用的部分必須作爲單個參數傳遞給sh。在這種情況下,您將無法在標準輸出中看到任何內容,並且必須打開並讀取剛剛寫入的文件。第一種選擇可能更明智。

正如別處指出的那樣,除非您期望輸出的量非常小,否則您不應該等待命令在消耗流之前退出。