Java:从命令行运行时重定向内部进程输出
我使用以下代码重定向从Java应用程序启动的进程的输出:Java:从命令行运行时重定向内部进程输出,java,windows,eclipse,java-7,Java,Windows,Eclipse,Java 7,我使用以下代码重定向从Java应用程序启动的进程的输出: ProcessBuilder builder = new ProcessBuilder("MyProcess.exe"); builder.redirectOutput(Redirect.INHERIT); builder.redirectErrorStream(true); 现在,当我从eclipse运行代码时,这一切都很好——我可以在eclipse的控制台中看到输出。 然而,当我创建一个jar文件并从cmd窗口运行它时,例如,jav
ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.redirectOutput(Redirect.INHERIT);
builder.redirectErrorStream(true);
现在,当我从eclipse运行代码时,这一切都很好——我可以在eclipse的控制台中看到输出。然而,当我创建一个jar文件并从cmd窗口运行它时,例如,
java-jar MyJar.jar
,它不会打印进程的输出。这可能是什么原因?可能是,该进程正在打印错误并出于某种原因退出。因此,实际输出进入错误流,而不是输出流。您的代码只重定向出流,因此重要的进程错误信息可能会丢失。我建议使用以下代码继承Out和Err流:
ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.inheritIO();
重定向这两个流的另一个原因与子进程的输出缓冲有关。如果父进程(java应用程序)没有读取或重定向子进程的标准流(Out和Err),则后者可能会在一段时间后被阻止,无法取得任何进一步的进展
无论如何,在输出中出现可能的错误肯定不会有什么坏处。我知道我回答得晚了,但在找到答案之前我遇到了这个问题,我想让其他人也在同一条船上进行一些搜索 这实际上是Windows的一个已知错误: 您可以通过自己重定向流来绕过它:
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();
谢谢,我实际上忘了添加一行
builder.redirectErrorStream(true)代码>。我还尝试用您建议的方法替换这两个方法,但结果是一样的。此外,内部进程似乎运行时没有错误(根据我通过其他指标看到的情况,例如运行时间)。您能在cmd窗口中看到System.out.println()输出吗?通道是System.out本身被重定向到某个地方,例如在日志文件中。是的,我可以看到System.out输出。我有以下代码:processproc=builder.start();int result=proc.waitFor();系统输出打印项次(结果)代码>此代码打印0,就像在进程中使用代码0退出一样。我还没有尝试测试它,因为这是我以前工作中的代码…:-)但这似乎确实是个问题。谢谢