【发布时间】:2010-07-20 16:34:25
【问题描述】:
我已经在我的 Java 代码中启动了一个进程,这个进程需要很长时间才能运行,并且可能会不时产生一些输出。我需要在生成每个输出时对其做出反应,最好的方法是什么?
【问题讨论】:
标签: java multithreading iostream
我已经在我的 Java 代码中启动了一个进程,这个进程需要很长时间才能运行,并且可能会不时产生一些输出。我需要在生成每个输出时对其做出反应,最好的方法是什么?
【问题讨论】:
标签: java multithreading iostream
你说的是什么反应?进程是否写入其标准输出和/或标准错误?如果是这样,我怀疑 Process.getInputStream 和 Process.getErrorStream 是您正在寻找的。阅读这两篇文章并做出相应的反应。请注意,您可能希望从不同的线程中读取它们,以避免任一流的单独缓冲区被填满。
或者,如果您不需要两者分开,只需将ProcessBuilder 中的redirectErrorStream 保留为false,这样错误流和输出流就会合并。
【讨论】:
您应该启动一个从Process.getInputStream() 和getErrorStream()(或者使用ProcessBuilder.redirectErrorStream(true))读取的线程,并在流中出现某些内容时处理它。有很多方法可以处理它——正确的方法取决于数据的使用方式。请告诉更多细节。
这是一个真实的例子:SbtRunner 使用ProcessRunner 向命令行应用程序发送命令并等待命令完成执行(当命令完成执行时应用程序将打印“>”)。发生了一些间接事件,以便更容易地从进程的输出中读取(输出被写入 MulticastPipe,然后由 OutputReader 读取)。
【讨论】: