运行 另一个程序,但单独留下 stdout/stderr

Running another program but leaving stdout/stderr alone

我需要从一个 Java 程序到 运行 另一个程序(一个普通的命令行可执行文件),等待它完成,检查退出代码。这可以很容易地完成:

static void run(String[] cmd) throws IOException, InterruptedException {
  var more = false;
  for (var s : cmd) {
    if (more) System.out.print(' ');
    more = true;
    System.out.print(s);
  }
  System.out.println();
  var builder = new ProcessBuilder(cmd);
  var process = builder.start();
  process.waitFor();
  var e = process.exitValue();
  if (e != 0) {
    System.out.println("process exit value: " + e);
    System.exit(e);
  }
}

但是,stdout/stderr 从该程序进入位桶。有没有办法改变一些事情,使 stdout/stderr 正常显示在控制台上,就像从 shell 脚本调用程序时那样?

不是寻找如何捕获stdout/stderr。我知道该怎么做;它涉及一些比较混乱的多线程代码,以及在将结果输出转储到控制台之前的延迟。相反,我希望有一种简单的方法可以告诉相关机器只让 stdout/stderr 像往常一样单独输出到控制台。

您可以对 stdout 使用 redirectOutput,对 stderr 使用类似的调用 redirectError

builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
builder.redirectError(ProcessBuilder.Redirect.INHERIT);

因为 @Abra points out, the inheritIO() 方法方便了这两个调用以及标准输入等价物。