1

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

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

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

4

2 回答 2

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();
于 2014-02-11T23:15:22.207 回答
0

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

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

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

无论如何,在输出中出现可能的错误绝对不会有什么坏处。

于 2013-10-31T16:28:25.930 回答