我一直试图使用以下commnand从Java运行已编译的C程序。然后我想从流程中得到结果'输入流。
Process p = Runtime.getRuntime().exec(commandLine);
现在,我的命令是这样的(第一个字符串是程序的路径,第二个和第三个是文件的路径,哪个程序作为参数):
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流都是空的并且处理过程退出状态是一些错误代码。
这是最小的"工作"示例(我省略了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和其他地方已经阅读了其他几个答案。不幸的是,所述答案中的代码与我的代码几乎相同(并且不像我的代码不起作用那样对我有效。)
有人可以告诉我,我做错了什么?为什么stdout流为空而不是包含C程序的输出?为什么进程不以状态0退出(应该如此),但是前面提到的怪物?最后,如果你知道为什么我的Java代码没有按预期工作,你能解释为什么完全相同的命令可以在命令行中运行吗?
提前致谢。
答案 0 :(得分:0)
似乎该计划没有在其环境中获得所需的东西。你说程序退出时带有错误代码 - 这听起来像你的Java代码正在做它应该做的事情(启动程序并阅读退出代码)。
您的路径看起来相对 - 也许Java不是从您认为的目录开始的?尝试完成你的论点的完整路径,看看是否有帮助。
有没有办法可以解释应用中的错误代码?
如果所有其他方法都失败了,请尝试使用完整路径通过shell(cmd / c或sh,取决于您的操作系统)运行它。您可以在没有java的情况下测试它,然后将整个内容传递给java,看看是否得到相同的结果。