java - 运行另一个程序但保留 stdout/stderr

标签 java processbuilder

我需要从一个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 ,像平常一样输出到控制台。

最佳答案

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

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

@Abra指出,inheritIO()方法对于这两个调用以及 stdin 等效项来说都很方便。

关于java - 运行另一个程序但保留 stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70602781/

相关文章:

java - JSF 中的隐藏变量

java - 从 JVM 的角度来看,从原始数组继承是不可能的吗?

javascript - 如何在类文件中创建检查 NetworkConnectionStatus 并在 mainactivity 中使用

java - 将 Scala 反射 MethodSymbol/MethodSignature 转换为 Java 方法的最简单方法是什么?

java - 在 Intellij 中执行 Maven Clean 构建时无法执行提取错误

java - ProcessBuilder调试

java - ProcessBuilder 不在服务器上创建文件

java - 使用ProcessBuilder运行多个程序

java - 使用 java Runtime() 或 Process Builder 执行或运行应用程序

java - 当我将参数传递给无法比较时,ProcessBuilder 不工作