2011-08-17 53 views
19

我在文档中找不到对此的说明。 但是,当我们有一个Process对象,并调用getInputStream()正确地从getInputStream中关闭Java Process InputStream

,我们会得到我们应该明确地接近,当我们用它做一个新的流? 或 我们是否已经获得了与流程关联的流,我们不应该关闭,但流程会关注它吗?

基本上,我们应该如何与我们从Process.getInputStream()获得流互动?关闭还是不关闭?

回答

8

我的第一反应是关闭它,你总是关闭你打开的流。我意识到文档没有达到标准,但由于他们没有明确说明请不要关闭对我而言,这意味着遵循良好的编程习惯。

InputStream is = process.getInputStream() 
try { 
    // your code 
} finally { 
    try { is.close(); } catch (Exception ignore) {} 
} 

如果您需要确保这是没有问题的,只写了一个快速测试情况下你带来很大的输入流中几十个次,每次打开和关闭的InputStream。

+3

IOUtils.closeQuietly(is)将照顾try {is.close(); } catch(Exception ignore){} – Kirby

5

当您拨打Process.getInputStream()时,您将获得为该过程设置的现有输入流。当进程死亡时,输入流确实是而非会自动消失 - 将其视为可以读取的缓冲区。该进程的管道末端可能会关闭,但您的结束不是。关闭它是你的责任,尽管GC最终会得到它。

您还应该关闭其他两个:getErrorStream()getOutputStream()

+0

“当进程死亡时,输入流不会自动消失” - 当您启动进程时,Java正在运行“进程收割者”线程,该线程将关闭此类管道的本地端这个案例。 –

0

还是我们获得与 处理有关的已经存在的数据流,我们不应该关闭,但这个过程会照顾 关闭它?

没有的Javadoc是这么说的,是吗?

2

从阅读UNIXProcess.java,这是发生了什么:

我们需要两个状态之间进行区分:要么进程还活着,或者死了。

如果过程是活的,通过关闭的OutputStream(转到过程的标准输入),你说的是过程,有没有为它更多的投入。通过关闭InputStreams(进程的stdout,stderr),进程不再写入这些(如果它尝试,它将得到SIGPIPE)。

当进程终止时,Java将缓冲从标准输出/标准错误剩余的数据,并关闭所有三个流为你(正在运行“的过程收割者”线程,这是在过程中死亡通知)。任何尝试写入OutputStream都将失败。从InputStream中读取将返回缓冲的数据(如果有的话)。关闭他们中的任何一个都没有好处,但也不会造成伤害。 (底层文件描述符在这个时候关闭)。

0

你不关闭溪流,你没有打开 - 这是一个讨厌的副作用。 如果您创建了该流程,那么先杀掉它,然后关闭流。