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

Tam*_*nut 0 java linux terminal ubuntu

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

otter <proof.in >proof.out
Run Code Online (Sandbox Code Playgroud)

"proof.in"文件必须与otter可执行文件位于同一文件中.

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

java.lang.Runtime.getRuntime().exec("otter <proof.in >proof.out")
Run Code Online (Sandbox Code Playgroud)

但在此行之后,整个UI被冻结,没有任何反应,也没有生成输出文件.

有人能告诉我哪里弄错了吗?

在此先感谢Tamash

fge*_*fge 5

这是正常的:您正在尝试启动通常由shell发出的命令.

这里,<proof.in>proof.out被视为otter可执行文件的文字参数,而不是shell重定向.但是看到这个工具的主页,它将无法工作:它期望重定向通常提供的stdin上的数据.

您需要通过shell启动此命令,并且最好使用流程构建器:

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

等等

当然,您还应确保程序从正确的目录运行 - 幸运的是,ProcessBuilder您也可以这样做.