如何将子进程stdout/stderr重定向到Java中的主进程stdout/stderr?

Den*_*aia 9 java process

在其他语言(如bashPython)中,当我们生成子进程时,这个新进程将从父进程继承stdout和stderr.这意味着子进程的任何输出都将打印到终端以及父进程的输出.

我们如何在Java中实现相同的行为?

我的第一次尝试是:

proc = Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)

但它不会起作用.基于这个答案这个答案,我已经用以下代码替换了代码:

ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectOutput(System.out);
pb.redirectError(System.err);
Run Code Online (Sandbox Code Playgroud)

但是这甚至都没有编译,因为参数与预期的方法参数不兼容.

hen*_*nry 16

您需要读取您创建的进程的输出和错误流,并将输出写入您希望的位置(在您的情况下为System.out和System.err).

编辑.上面的答案对于java <7是正确的.从javadoc开始,它看起来可以代替调用

processBuilder.redirectOutput(Redirect.INHERIT)
Run Code Online (Sandbox Code Playgroud)

  • 以往可行或不可行.我刚检查了java 7 api,它看起来已经被解决了 - 你现在可以调用Redirect.INutIT中的redirectOutput传递,它看起来可以达到你想要的效果. (3认同)