繁体   English   中英

Java:从命令行运行时重定向内部进程输出

[英]Java: Redirecting inner process output when running from command line

我使用以下代码来重定向从Java应用程序启动的进程的输出:

ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.redirectOutput(Redirect.INHERIT);
builder.redirectErrorStream(true);

现在,当我从eclipse运行代码时,这可以正常工作-我可以在Eclipse的控制台中看到输出。
但是,当我创建一个jar文件并从cmd窗口运行它时,例如java -jar MyJar.jar ,它不会显示该进程的输出。 这可能是什么原因?

我知道我的回答迟到了,但是在遇到答案之前我遇到了这个问题,并希望在同一船上保存其他人进行搜索。

这实际上是Windows的已知错误: https : //bugs.openjdk.java.net/browse/JDK-8023130

您可以通过自己重定向流来解决它:

Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
   System.out.println(line);
}

p.waitFor();

br.close();

可能是由于某种原因该进程正在打印错误并退出。 因此,实际输出进入Err流,而不进入Out流。 您的代码仅重定向出流,因此重要的过程错误信息可能会丢失。 我建议使用以下代码同时继承Out和Err流:

ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.inheritIO();

重定向两个流的另一个原因与子进程的输出缓冲有关。 如果父进程(您的Java应用程序)没有读取或重定向子进程的标准流(Out和Err),则子进程可能会在一段时间后被阻止,无法取得进一步的进展。

无论如何,在输出中可能存在错误绝对是没有问题的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM