1

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

JavaWorld:运行时.exec

我浏览了这些示例,发现它们引入了一个新类StreamGobbler,该类接受 InputStream 并打印输出。但是我不明白为什么要引入这个。谁能解释一下。

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

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

这个实现是正确的还是有任何陷阱?

4

3 回答 3

1

由于您的程序可能会成功(这意味着程序的输出将在 上可用Process' getInputStream())或它可能会失败(这意味着程序的错误将Process' getErrorStream()在由StreamGobbler该类实现的单独线程。希望这在一定程度上澄清。

于 2012-09-04T05:30:55.323 回答
0

假设您不使用 StreamGobbler 解决方案,而只是使用getInputStream()来获取程序产生的标准输出。如果程序的执行只产生标准错误输出,当你试图读取InputStreamgetInputStream(). 我说“可能挂起”是因为我相信行为可能会因您的执行环境而异。我在执行 JUnit 测试时遇到了这个问题。

于 2013-03-11T20:45:10.237 回答
0

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

于 2017-04-13T16:22:34.243 回答