如何解决在Java 11中启动外部命令行过程
我正在使用基于CLI的验证工具来检查某些图像文件。它在命令提示符下运行,其中命令类似于“ my_app input_file config_file”。我想将其集成到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);
}
解决方法
注意the documentation of Runtime.exec(…)
:
exec(cmdarray)
形式的调用的行为与exec
(cmdarray,null,null)
的调用完全相同。
exec(cmdarray,null)
:
...
ProcessBuilder.start()
现在是在经过修改的环境下启动流程的首选方式。
问题是exec
总是为流程必须读取或写入的标准I / O创建管道,以与新流程进行通信。只有ProcessBuilder
允许以预期方式更改该行为:
Process p = new ProcessBuilder(
"/path/to/external/application/exefile","/c","./my_command -h")
.inheritIO().start();
关键部分是inheritIO()
,告诉流程构建者新流程应该继承标准的输入,输出和错误通道,而不是创建管道,以使用与您的流程相同的控制台。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。