在Java 11中启动一个外部命令行进程



我正在使用基于CLI的验证工具来检查一些图像文件。它在命令提示符下运行,其中命令类似于";my_app输入文件配置文件"。我想把它集成到Java应用程序中(Java 11中(。所以我需要从我的Java项目中运行它们。我试图通过以下代码从Java启动应用程序:

Runtime rt = Runtime.getRuntime();
try {
rt.exec(new String[]{"/path/to/external/application/exefile","/c","./my_command -h"});
} catch (IOException e) {
e.printStackTrace();
}

但它不会提示命令行并启动应用程序。有人能告诉我如何在Java 11中运行这个过程吗?

更新:

我的外部流程现在正在运行。但我遇到了另一个问题。该过程返回一些输出,我需要逐行检查。我需要检查它是否显示任何无效错误。如果出现无效错误,我将调用另一个外部进程。我试图使用BufferedReader来处理如下输出,但它没有显示任何结果。

BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s = null;
while ((s = output.readLine()) != null) {
System.out.println(s);
}

注意Runtime.exec(…):的文档

形式exec(cmdarray)的调用与调用exec(cmdarray, null, null)的行为方式完全相同。

exec(cmdarray, null, null)


ProcessBuilder.start()现在是在经过修改的环境中启动流程的首选方式。

问题是exec总是为您的进程必须读取或写入的标准I/O创建管道,以便与新进程通信。只有ProcessBuilder允许以预期方式改变该行为:

Process p = new ProcessBuilder(
"/path/to/external/application/exefile", "/c", "./my_command -h")
.inheritIO().start();

关键部分是inheritIO(),它告诉流程生成器,新流程应该继承标准的输入、输出和错误通道,而不是创建管道,以便使用与流程相同的控制台。

相关内容

最新更新