从Java运行命令行的问题
我一直在尝试使用以下命令从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
显然,我在这里阅读了*和其他地方的其他几个答案。不幸的是,上述答案中的代码与我的代码非常相似(并且与我的代码无法工作的方式相同)。
有人可以告诉我,我做错了什么?为什么标准输出流是空的而不是包含C程序的输出?为什么程序不会以状态0退出(它应该如此),但是前面提到的怪物?最后,如果你知道,为什么我的Java代码不能按预期工作,你能解释一下,为什么命令行中的命令完全相同?
在此先感谢。
看起来程序在它的环境中没有得到它需要的东西。你说程序退出了一个错误代码 - 这样听起来像你的Java代码正在做它应该做的事情(启动程序并阅读退出代码)。
你的路径看起来相对 - 也许Java不是从你认为的目录开始的?尝试对你的论点做一个完整的路径,看看是否有帮助。
有没有一种方法可以解释应用程序的错误代码?
如果一切都失败,请尝试使用完整路径通过shell(cmd/c或sh取决于您的操作系统)运行它。你可以在没有java的情况下测试,然后把所有东西都传给java,看看你是否得到了相同的结果。
当我用绝对路径运行它时,结果是完全一样的 - 在Java中相同的错误代码,在命令行中相同的正确结果。 – awa993
直接从Java调用“cmd”或“sh”并将您的应用作为参数传递的情况如何? (你可以比较它只是执行“回声”,以确定它是Java还是你的C应用程序) –
错误代码可能是因为找不到您尝试启动的文件。尝试将路径更改为绝对路径而不是相对路径。或者因为你没有从你期望的目录开始,所以找不到命令的参数。 – MTilsted