Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从命令行运行时重定向内部进程输出_Java_Windows_Eclipse_Java 7 - Fatal编程技术网

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

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

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退出一样。我还没有尝试测试它,因为这是我以前工作中的代码…:-)但这似乎确实是个问题。谢谢