我使用以下代码重定向我从Java应用程序启动的进程的输出:
ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.redirectOutput(Redirect.INHERIT);
builder.redirectErrorStream(true);
现在,当我从eclipse运行代码时,这很好用 - 我可以在Eclipse的控制台中看到输出
然而,当我创建一个jar文件并从cmd窗口运行它时,例如java -jar MyJar.jar
,它不会打印进程的输出。这可能是什么原因?
答案 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),那么后者可能会在一段时间后被阻止,无法进一步进展。
无论如何,输出中可能存在错误肯定不会有害。