了解StreamGobbler

时间:2012-09-04 05:08:56

标签: java runtime.exec outputstream

我正在通过Runtime.exec实现一个mailx命令,并且遇到了这篇文章,它解释了正确的方法。

JavaWorld : Runtime.exec

我已经通过这些示例看到他们引入了一个新类StreamGobbler,它接受​​InputStream并打印输出。 但是我不明白为什么会这样做的原因。任何人都可以解释一下。

同样作为我的代码的一部分,我写了以下

OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream())
osw.write(mailBody)
osw.close

此实施是否正确或有任何陷阱?

3 个答案:

答案 0 :(得分:1)

由于您的程序可能会成功(这意味着程序的输出可以在Process' getInputStream()上获得),或者它可能会失败(这意味着程序的错误可以在{{1 }} Process',您应该能够并行读取这些内容,因此需要一个由getErrorStream()类实现的单独线程。希望这在某种程度上澄清。

答案 1 :(得分:0)

假设您不使用StreamGobbler解决方案并只使用getInputStream()来获取程序生成的标准输出。如果程序的执行仅生成标准错误输出,则当您尝试读取InputStream返回的getInputStream()时,Java代码可能会挂起。我说“可能会挂起”因为我认为行为可能会因您的执行环境而异。我在执行JUnit测试时遇到了这个问题。

答案 2 :(得分:0)

ProcessBuilder有一个方法将错误流重定向到输入流(ProcessBuilder.redirectErrorStream),因此您不需要单独的线程来并行读取流。但是,InputStream.read可能会阻塞并通过Thread.interrupt not interruptable,因此如果您需要在读取时设置超时,则可能需要使用单独的线程" StreamGobbler"。