ProcessBuilder重定向到标准输出

27

我希望将一个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);
}

我本来期望“cmd”命令的输出结果像:

Microsoft Windows [version 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

能够在运行java程序的DOS控制台中显示。 但是在DOS控制台中根本没有任何显示。

在其他讨论线程中,我看到使用BufferedReader类的解决方案:但是我希望将进程的输出直接显示在标准输出中,而不使用任何BufferedReader或“while读取循环”。这可行吗?

谢谢。


3
查看 System 类的 API,找到所需的方法:setOut(...)setIn(...)setErr(...)。请注意,在翻译过程中不要改变原意,保持简洁易懂,不添加解释或其他内容。 - Hovercraft Full Of Eels
应该可以。我不明白为什么不行。 - Qix - MONICA WAS MISTREATED
2个回答

29

尝试使用 ProcessBuilder.inheritIO() 来使用与当前 Java 进程相同的 I/O。另外,您可以链接这些方法:

ProcessBuilder pb = new ProcessBuilder("cmd")
    .inheritIO()
    .directory(new File("C:"));
pb.start();

4
仅供我个人参考的一条注释 - 如果您在调用 pb.destroy() 后立即调用它,您将无法获得任何输出(即使您调用了 System.out.flush()); - Sridhar Sarnobat

19

你错过了一个关键部分,你需要实际开始你的进程并等待输出。我相信这会起作用。

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接