我正在使用基于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()
,它告诉流程生成器,新流程应该继承标准的输入、输出和错误通道,而不是创建管道,以便使用与流程相同的控制台。