2016-04-27 210 views
0

我一直在嘗試使用以下命令從Java運行編譯的C程序。然後我想從流程的輸入流中獲得結果。從Java運行命令行的問題

Process p = Runtime.getRuntime().exec(commandLine); 

現在,我的命令是這個(第一字符串路徑程序,第二和第三是路徑的文件,這方案需要爲PARAMS):

trec_eval.8.1\trec_eval.exe trec_eval.8.1\czech TREC\results_2016-04-26_20_52_175.txt 

當我運行它通常是從命令(我在Windows 10上),它按預期工作(C程序完成沒有錯誤,並將預期的輸出打印到命令行中),但是,當我從Java運行它時,它不起作用。進程的stdout和stderr流都是空的,進程的退出狀態是一些錯誤代碼。

下面是最小的 「工作」 的例子(I省略stderr的流,因爲它使該代碼段太長):

從這個代碼
String commandLine = "trec_eval.8.1\\trec_eval.exe" + 
      " trec_eval.8.1\\czech + " " + file; 
System.out.println("Command: " + commandLine); 

Process process = Runtime.getRuntime().exec(commandLine); 
BufferedReader stdout = new BufferedReader(new InputStreamReader(process.getInputStream())); 

StringBuilder output = new StringBuilder("Output:\n"); 
for (String line; (line = stdout.readLine()) != null;) { 
     output.append(line).append("\n"); 
} 
System.out.println(output.toString()); 

int exitStatus = 0; 
try { 
    exitStatus = process.waitFor(); 
} catch (InterruptedException ie) { 
    ie.printStackTrace(); 
} 
System.out.println("Exit status: " + exitStatus); 
stdout.close(); 

輸出被下列行:

Command: trec_eval.8.1\trec_eval.exe trec_eval.8.1\czech TREC\results_2016-04-27_18_27_585.txt 
Output: 
Exit status: -1073741515 

顯然,我在這裏閱讀了Stackoverflow和其他地方的其他幾個答案。不幸的是,上述答案中的代碼與我的代碼非常相似(並且與我的代碼無法工作的方式相同)。

有人可以告訴我,我做錯了什麼?爲什麼標準輸出流是空的而不是包含C程序的輸出?爲什麼程序不會以狀態0退出(它應該如此),但是前面提到的怪物?最後,如果你知道,爲什麼我的Java代碼不能按預期工作,你能解釋一下,爲什麼命令行中的命令完全相同?

在此先感謝。

+0

錯誤代碼可能是因爲找不到您嘗試啓動的文件。嘗試將路徑更改爲絕對路徑而不是相對路徑。或者因爲你沒有從你期望的目錄開始,所以找不到命令的參數。 – MTilsted

回答

0

看起來程序在它的環境中沒有得到它需要的東西。你說程序退出了一個錯誤代碼 - 這樣聽起來像你的Java代碼正在做它應該做的事情(啓動程序並閱讀退出代碼)。

你的路徑看起來相對 - 也許Java不是從你認爲的目錄開始的?嘗試對你的論點做一個完整的路徑,看看是否有幫助。

有沒有一種方法可以解釋應用程序的錯誤代碼?

如果一切都失敗,請嘗試使用完整路徑通過shell(cmd/c或sh取決於您的操作系統)運行它。你可以在沒有java的情況下測試,然後把所有東西都傳給java,看看你是否得到了相同的結果。

+0

當我用絕對路徑運行它時,結果是完全一樣的 - 在Java中相同的錯誤代碼,在命令行中相同的正確結果。 – awa993

+0

直接從Java調用「cmd」或「sh」並將您的應用作爲參數傳遞的情況如何? (你可以比較它只是執行「回聲」,以確定它是Java還是你的C應用程序) –