【问题标题】:How to make Redirect.INHERIT and System.setOut work together如何使 Redirect.INHERIT 和 System.setOut 一起工作
【发布时间】:2014-04-17 10:50:04
【问题描述】:

这可能是一个微不足道的问题,但我无法轻易找到答案。我有一个简单的 Java 程序:

System.setOut(new PrintStream(new File("stdout.txt")));
...
...
ProcessBuilder pb = new ProcessBuilder("... some args ...");
pb.inheritIO();
pb.start().waitFor();

我的意图是将进程的所有输出(包括子pb)存储在stdout.txt 中。但是,这似乎不起作用,pb 的输出被重定向到我的进程父进程的标准输出,就好像从未调用过 System.setOut(...)

有什么方法可以使用pb.inheritIO/pb.inheritOutput 方法重定向到重定向 System.out?我错过了什么明显的东西吗?我知道我可以通过在线程中手动读取孩子的标准输出来做到这一点旧方法,但这更麻烦。

干杯, 杰克

【问题讨论】:

  • 想知道是否有人对此有一些 cmets/答案?
  • 你有什么运气吗?我也有同样的问题。
  • 不,不是。我不得不回到在后台转储流的线程。
  • 我也必须这样做。没有灵丹妙药:(

标签: java processbuilder system.out


【解决方案1】:

请看我的回答https://stackoverflow.com/a/32342557/5226711:

ProcessBuilder 的 I/O 重定向不重定向流,但 文件描述符。即使将System.out 设置为另一个流也不会 更改初始标准输出的文件描述符。 ProcessBuilder.inheritIO() 继承父进程的标准 输出/输入/错误文件描述符。

PrintStream 实例未传递给已启动的操作 系统进程,而是类似的东西(它是伪代码,我没有 认为它确实有效):

((FileOutputStream) System.out.out).getFD()

或者,更正确:

FileDescriptor.out

static final表示它不会改变,即使 您将 System.out 设置为不同的值。

关于您的问题,这意味着您必须使用FileProcessBuilder.redirectOutput(File) 而不是PrintStream

ProcessBuilder pb = new ProcessBuilder("... some args ...");
pb.redirectOutput(new File("stdout.txt"));
pb.start().waitFor();

这只会将子进程的输出重定向到 stdout.txt。

如果要同时引导父进程和子进程的所有输出,则必须将父进程的 System.out 重定向到文件,并在父进程中捕获子进程的输出并将其输出到重定向的 System.out:

System.setOut(new PrintStream(new File("stdout.txt")));
ProcessBuilder pb = new ProcessBuilder("... some args ...");
Process p = pb.start();
BufferedReader childOutput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = output.readLine()) != null) {
    System.out.println(line); // child`s output goes to stdout.txt
}

【讨论】:

  • 感谢 Lars 花时间您的回答澄清了没有希望的事情 ;-) 但手动捕获孩子的输出。干杯
猜你喜欢
  • 1970-01-01
  • 2019-10-13
  • 2015-07-02
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2020-02-16
  • 2020-01-10
相关资源
最近更新 更多