从Java启动外部进程:stdout和stderr

时间:2016-08-04 10:14:54

标签: java process

我正在使用标准java.lang.Process从java启动外部进程。 我试图弄清楚该过程的输出是什么,但是以一种结合了stdoutstderr的格式。

目前,我Process#getInputStream可以访问stdoutProcess#getErrorStream可以访问stderr。 这一切都很好,除了我们不能通过时间戳来命令stdout和stderr的输出。

假设该过程有这样的输出:

  • 一行(A)写入stdout
  • 一行(B)写入stderr
  • 一行(C)写入stdout

Java不允许我们知道在(A)之后和之前(C)之前写入了行(B)。 我想知道是否有任何方法可以合并外部进程的stdout和stderr,以便我们知道哪些语句被打印到输出。

2 个答案:

答案 0 :(得分:2)

如果您使用ProcessBuilder API而不是普通的Runtime.exec(),那么您可以重定向输出和错误流,包括将它们重定向到同一个流。

ProcessBuilder pb =
  new ProcessBuilder("myCommand", "myArg1", "myArg2");
pb.redirectErrorStream(true); // merges err with out
pb.redirectOutput(Redirect.appendTo(new File("out.txt")));
Process p = pb.start();
p.waitFor();

答案 1 :(得分:0)

ProcessBuilder.redirectErrorStream(真);没有按预期工作 - 在我的电脑上(Windows 10,Java 8),当外部执行perl程序时,所有警告和错误消息都显示在任何其他输出之前,无论实际排序是什么,无论是在cmd / c之前还是不,从内部批处理执行或不执行,甚至重定向交换机2>& 1内部批处理无法帮助