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

时间:2013-10-31 16:17:08

标签: java windows eclipse java-7

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

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

现在,当我从eclipse运行代码时,这很好用 - 我可以在Eclipse的控制台中看到输出 然而,当我创建一个jar文件并从cmd窗口运行它时,例如java -jar MyJar.jar,它不会打印进程的输出。这可能是什么原因?

2 个答案:

答案 0 :(得分:2)

我知道我回答的时间已经很晚了,但是在遇到答案之前我遇到了这个问题,想要在同一条船上搜出其他人进行搜索。

这实际上是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();

答案 1 :(得分:0)

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

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

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

无论如何,输出中可能存在错误肯定不会有害。