一尘不染

通过Java终端通过外部程序执行

linux

我有一个外部程序Otter,该程序将一些文件名作为参数并创建了一个输出文件,也将其指定为参数。因此,例如,如果我的输入是“
proof.in”,并且我希望将输出放置在“ proof.out”文件中,则可以在终端中运行以下命令:

otter <proof.in >proof.out

“ proof.in”文件必须与水獭可执行文件位于同一文件中。

问题是我需要Java提供此功能,因此在我的Java代码中执行以下操作:

java.lang.Runtime.getRuntime().exec("otter <proof.in >proof.out")

但是在此行之后,整个用户界面被冻结,并且什么也没有发生,并且没有生成输出文件。

谁能告诉我我错了哪里?

在此先感谢Tamash


阅读 172

收藏
2020-06-07

共1个答案

一尘不染

这是正常现象:您正在尝试启动通常由Shell发出的命令。

在这里,<proof.in>proof.out作为otter可执行文件的文字参数,而不是shell重定向。但是查看该工具的主页将无法正常工作:它需要标准输入(通常由重定向提供)上的stdin数据。

您需要通过外壳(最好使用流程构建器)启动此命令:

final ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "otter <proof.in >proof.out");
final Process p = pb.start();

等等等

当然,您还应该确保程序从正确的目录运行-幸运的是,ProcessBuilder还允许您执行此操作。

2020-06-07