我需要从一个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/