1

我正在尝试从我的 Java Web 应用程序运行 c++ 可执行文件。当我转到相关页面时,它会执行命令并运行可执行文件,但不会产生任何输出。

这是我的代码:

URL createWav = QRcodeController.class.getClassLoader().getResource("createWav");
log.info("The path of the c++ executable obtained: "+ createWav.getPath());
Process p1 = Runtime.getRuntime().exec("chmod 777 " + createWav.getPath());
p1.waitFor();
int exitVal=1;
try {
        Process p2 = Runtime.getRuntime().exec(createWav.getPath(), args);
        exitVal = p2.waitFor();
}
catch (Exception e)
{
    log.error(e.getStackTrace());
}
if(exitVal == 1)
    throw new Exception("Error in c++ program");

它不会抛出任何错误,因此 c++ 程序运行良好,但它不会生成它应该生成的文件。当我在同一台机器上从命令行运行相同的命令时,它可以完美地生成所需的文件。我不确定我做错了什么。

4

2 回答 2

2

从进程中获取输出流和错误流,看看会发生什么。

现在你在盲目地工作。

于 2012-06-28T10:40:58.890 回答
1

C++ 程序将其输出写入管道,而不是 Java 程序的标准输出。使用Process.getOutputStream()访问该流,或者在 Java 1.7 中使用一个ProcessBuilder可以使用redirectOutput的地方,如下所示:

pb.redirectOutput(ProcessBuilder.Redirect.INHERIT)

如果您的 C++ 程序可能会将内容写入其标准错误流,您可能应该以相同的方式处理它。

另请注意,如果与管道关联的缓冲区已满,则将这些流中的任何一个连接到管道并且不从该管道读取可能会导致您的应用程序阻塞输出。要简单地忽略输出,您必须明确地将其重定向到/dev/null. 这不是你刚才的目标,但它可能处于不同的情况。

于 2012-06-28T10:47:22.023 回答