2013-11-25 103 views
0

我有一個java jar文件,它會調用一個java程序(命令)。Runtime.getRuntime()。exec掛起

命令生成工作正常,當我運行它在命令promt。

Process proc = Runtime.getRuntime().exec("cmd.exe /C "+ Command); 

     BufferedReader stdIn = new BufferedReader(new 
        InputStreamReader(process.getInputStream())); 

       BufferedReader stdErr = new BufferedReader(new 
        InputStreamReader(process.getErrorStream())); 

      String output=null; 
      while((output=stdIn.readLine())!=null) 
      { 
       System.out.println("output is:"+output); 
       out.write(output); 
       out.newLine(); 

      } 
      while((output=stdErr.readLine())!=null) 
      { 
       System.out.println("error output is:"+output); 
       out.write(output); 
       out.newLine(); 

      } 
      try { 
process.waitFor(); 
.... 
.... 
.... 

我試過的ProcessBuilder:

ProcessBuilder proc = new ProcessBuilder("cmd.exe", "/C", Command);   proc.redirectErrorStream(true); 
proc.start(); 

但是,這將引發錯誤爲:

java.io.IOException: Cannot run program "java -Xmx1024M ......" 
CreateProcess error=2, The system cannot find the file specified 

我可以在其中PROMT作品精絕運行相同的命令。

回答

1

隨着

new ProcessBuilder("cmd.exe", "/C", Command); 

您使用的構造函數的可變參數超載。這意味着該命令被假定已經被解析爲參數。但是,您將完整的Command作爲單個參數傳遞,這意味着cmd會將整個命令行java -Xmx...解釋爲僅用於運行的命令(文件名)。

要麼堅持單個字符串,要依靠ProcessBuilder類來解析它,或者預先解析所有內容。

至於你有掛的問題,可能有以下幾個原因:

  • 也許你out流阻塞;
  • 也許您正在開始的程序寫入stderr,根本沒有讀取,直到它已經太晚(程序結束)。

第二種方法可以通過合併stdoutstderr來解決此問題。

+0

謝謝Marko。命令是這樣的:「java -Xmx1024M -Djava.util.logging.file =」log // logs.txt「-classpath lib \ tool.jar; lib \ solver.jar com.tool.section.MainFunc -parameter redo section logo.propery C:\ SectionTool「我不知道如何將它傳遞給ProcessBuilder:( – kino

+0

Somethnig like'(」cmd.exe「,」/ c「,」java「,」-Xmx1024m「,」-Djava。 util.logging.file = log/logs.txt「,等等。 –

+0

Thanks Marko。(啊..我剛看到一個代碼流,看到我們需要跟上現在的相同代碼..意思是我們需要使用Process proc = Runtime.getRuntime()。exec(「cmd.exe/C」+ Command);才能找到一個解決方案,這是因爲很多代碼已經使用BufferedReader寫入,如果我們使用BufferedReader,必須重寫ProcessBuilder。我們可以通過這種方式解決什麼問題? – kino

相關問題