【发布时间】:2016-10-08 10:49:52
【问题描述】:
假设我在 Java 中启动了一个子进程,它可能会写入 stdout 和 stderr:
Process subprocess = Runtime.getRuntime().exec(…);
我想读取它所有的标准输出和标准错误;或者直接忽略它们。
-
如果我这样做:
readAllFrom(subprocess.getInputStream()); //stdout is getInputStream, weird! readAllFrom(subprocess.getErrorStream()); //stderr...如果子进程首先尝试将数据输出到 stderr 并因此在该点阻塞,它会卡住。
如果我这样做:
while (…) { readLineFrom(subprocess.getInputStream()); readLineFrom(subprocess.getErrorStream()); }……实际上,风险似乎是一样的。
-
如果我这样做:
while (…) { nonblockingReadFrom(subprocess.getInputStream()); nonblockingReadFrom(subprocess.getOutputStream()); }nonblockingReadFrom可以是这样的:… nonblockingReadFrom(InputStream stream) { byte[] buffer = new byte[…]; stream.read(buffer, 0, Math.min(stream.available(), buffer.length)); … }…如果子进程输出数据时有一些暂停,这将导致无用的 100%-CPU 负载。
当然,我可以创建单独的线程。像这里的东西(1,2)。但我的问题是关于在同一个线程中做所有事情。可能需要类似 select system call 的 Java 接口。
所以,问题是:是否可以在不使用额外线程或临时文件的情况下,在 Java 中正确处理 java.lang.Process 类型子进程的 stdout 和 stderr?
【问题讨论】:
-
你见过这个 - stackoverflow.com/questions/14165517/… 吗?
-
@GhostCat,似乎无关。接受的答案使用流 gobblers,这是多线程解决方案。 Evgeniy Dorofeev 的回答只是相应地将子进程的 stdout 和 stderr 重定向到主进程的 stdout 和 stderr,这不是我的目标。
-
是否可以将标准错误重定向到标准输出?如果是这样,this question 可能会有所帮助。
-
请查看此链接stackoverflow.com/questions/5711084/…。它可能对您的目的有所帮助。
-
@LukeWoodward,当然没有。
标签: java process runtime.exec