Java 理解流吞噬者

Java 理解流吞噬者,java,runtime.exec,outputstream,Java,Runtime.exec,Outputstream,我正在通过Runtime.exec实现一个mailx命令,并且偶然发现了这篇文章,它解释了正确的方法 我浏览了这些示例,发现它们引入了一个新类StreamGobbler,它接受InputStream并打印输出。 不过,我不明白为何会引入这项措施。谁能解释一下吗 作为我代码的一部分,我还编写了以下代码 OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream()) osw.write(mailBody) osw.cl

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

我浏览了这些示例,发现它们引入了一个新类
StreamGobbler
,它接受InputStream并打印输出。 不过,我不明白为何会引入这项措施。谁能解释一下吗

作为我代码的一部分,我还编写了以下代码

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

此实现是否正确或存在任何缺陷?

因为您的程序可能会成功(这意味着程序的输出将在
进程'
上可用),或者可能会失败(这意味着程序的错误将在
进程'
getErrorStream()
上可用,您应该能够并行读取这些错误,因此需要一个单独的线程,该线程由
StreamGobbler
类实现。希望这在一定程度上得到澄清。

因为您的程序可能会成功(这意味着程序的输出将在
进程'
getInputStream()
)上可用,或者它可能会失败(这意味着程序的错误将在
进程'
getErrorStream()上可用),您应该能够并行阅读这些内容,因此需要一个单独的线程,该线程由
StreamGoBler
类实现。希望这能在一定程度上澄清。

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

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

ProcessBuilder有一种方法可以将错误流重定向到输入流()因此,您不需要单独的线程来并行读取流。但是,InputStream.read可能会阻塞,并且是通过thread.interrupt执行的,因此,如果需要在读取上设置超时,您可能需要使用单独的线程“StreamGobbler”。

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