ProcessBuilder重定向到标准输出

Joh*_*ohn 20 java inheritance redirect stream processbuilder

我想将java进程输出重定向到父java进程的标准输出.

使用ProcessBuilder类如下:

public static void main(String[] args) {
  ProcessBuilder processBuilder = new ProcessBuilder("cmd");
  processBuilder.directory(new File("C:"));   
  processBuilder.redirectErrorStream(true); // redirect error stream to output stream
  processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
}
Run Code Online (Sandbox Code Playgroud)

我原以为"cmd"的输出,如:

Microsoft Windows [版本6.1.7601]版权所有(c)2009 Microsoft Corporation.Tousdroitsréservés.

显示在用于运行java程序的DOS控制台中.但是在DOS控制台中根本没有显示任何内容.

在讨论的其他主题中,我看到了使用BufferedReader类的解决方案:但是在这里我希望过程的输出直接显示在标准输出中,而不使用任何BufferedReader或"while read loop".可能吗?

谢谢.

Ren*_*aud 18

尝试ProcessBuilder.inheritIO()使用与当前Java进程相同的I/O. 另外,你可以菊花链方式:

ProcessBuilder pb = new ProcessBuilder("cmd")
    .inheritIO()
    .directory(new File("C:"));
pb.start();
Run Code Online (Sandbox Code Playgroud)

  • 只是我自己信息的一个脚注 - 如果你过早地调用`pb.destroy()`你将不会得到任何打印(即使你调用`System.out.flush()`); (3认同)

Ell*_*sch 17

你确实错过了一个关键部分,你实际上需要开始你的过程并等待你的输出.我相信这会奏效,

processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
// Start the process.
try {
  Process p = processBuilder.start();
  // wait for termination.
  p.waitFor();
} catch (IOException e) {
  e.printStackTrace();
} catch (InterruptedException e) {
  e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • 应该接受@Elliott Frisch的回答 (2认同)