从Java运行命令行的问题

时间:2016-04-27 16:59:06

标签: java windows command-line

我一直试图使用以下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代码没有按预期工作,你能解释为什么完全相同的命令可以在命令行中运行吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

似乎该计划没有在其环境中获得所需的东西。你说程序退出时带有错误代码 - 这听起来像你的Java代码正在做它应该做的事情(启动程序并阅读退出代码)。

您的路径看起来相对 - 也许Java不是从您认为的目录开始的?尝试完成你的论点的完整路径,看看是否有帮助。

有没有办法可以解释应用中的错误代码?

如果所有其他方法都失败了,请尝试使用完整路径通过shell(cmd / c或sh,取决于您的操作系统)运行它。您可以在没有java的情况下测试它,然后将整个内容传递给java,看看是否得到相同的结果。