我正在使用标准java.lang.Process
从java启动外部进程。
我试图弄清楚该过程的输出是什么,但是以一种结合了stdout
和stderr
的格式。
目前,我Process#getInputStream
可以访问stdout
,Process#getErrorStream
可以访问stderr
。
这一切都很好,除了我们不能通过时间戳来命令stdout和stderr的输出。
假设该过程有这样的输出:
Java不允许我们知道在(A)之后和之前(C)之前写入了行(B)。 我想知道是否有任何方法可以合并外部进程的stdout和stderr,以便我们知道哪些语句被打印到输出。
答案 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内部批处理无法帮助