2016-04-27 178 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应用程序) –