监视进程输出及其执行的最佳方法

时间:2010-07-20 16:34:26

标签: java multithreading iostream

我已经在我的Java代码中启动了一个进程,这个过程需要很长时间才能运行,并且可能会不时生成一些输出。生成时我需要对每个输出做出反应,这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

你在谈论什么样的反应?该过程是否写入其标准输出和/或标准错误?如果是这样,我怀疑Process.getInputStreamProcess.getErrorStream是您正在寻找的。从这两者中读取并做出相应的反应。请注意,您可能希望从不同的线程中读取它们,以避免任何流的单个缓冲区填满。

或者,如果您不需要单独使用这两个,请将redirectErrorStream中的ProcessBuilder保留为false,以便合并错误和输出流。

答案 1 :(得分:1)

您应该启动一个从Process.getInputStream()getErrorStream()(或者使用ProcessBuilder.redirectErrorStream(true))读取的线程,并在流中显示某些内容时处理它。如何处理它的方法有很多 - 正确的方法取决于数据的使用方式。请详细说明。

以下是一个真实示例:SbtRunner使用ProcessRunner向命令行应用程序发送命令并等待命令完成执行(应用程序将在命令时打印“>”完成执行)。有一些间接发生,以便更容易从进程的输出中读取(输出被写入MulticastPipe,然后由OutputReader读取。