从getInputStream正确关闭Java进程InputStream

从getInputStream正确关闭Java进程InputStream,java,process,inputstream,Java,Process,Inputstream,我在文件中找不到对此的澄清。 但是当我们有一个进程对象并调用getInputStream()时 我们是否得到了一个新的流,当我们完成它时,我们应该显式地关闭它? 或 我们是否得到了已经存在的与流程相关联的流,我们不应该关闭它,但流程会负责关闭它 基本上,我们应该如何与从Process.getInputStream()获得的流交互?关闭还是不关闭?我的第一反应是关闭它,你总是关闭你打开的流。我确实意识到文档不符合标准,但是因为它们没有明确的状态,所以不要关闭它,这意味着遵循良好的编程实践。 Inp

我在文件中找不到对此的澄清。 但是当我们有一个
进程
对象并调用
getInputStream()

我们是否得到了一个新的流,当我们完成它时,我们应该显式地关闭它? 或 我们是否得到了已经存在的与流程相关联的流,我们不应该关闭它,但流程会负责关闭它


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

我的第一反应是关闭它,你总是关闭你打开的流。我确实意识到文档不符合标准,但是因为它们没有明确的状态,所以不要关闭它,这意味着遵循良好的编程实践。
InputStream is = process.getInputStream()
try {
    // your code
} finally {
    try { is.close(); } catch (Exception ignore) {}
}

如果您需要确保这没有问题,只需编写一个快速测试用例,在其中您可以从输入流执行几十次测试,每次打开和关闭输入流。

我总是关闭它们!我不是100%确定,但据我所知,如果您保持inputstream打开,文件将一直打开,直到您关闭它!!所以,遵循“标准规则”并关闭它!举个例子:

当您调用
Process.getInputStream()
时,您将获得为该流程设置的现有输入流。当进程结束时,输入流不会自动消失——将其视为一个仍然可以读取的缓冲区。流程的管道末端可能已关闭,但您的末端未关闭。关闭它是您的责任,尽管GC最终会得到它

您还应该关闭另外两个:
getErrorStream()
getOutputStream()

或者我们得到的是已经存在的流,与 这个过程,我们不应该关闭,但是这个过程会处理好的 关闭它


没有Javadoc这么说,是吗?

从UNIXProcess.java的阅读中,会发生以下情况:

我们需要区分两种状态:要么进程仍然活着,要么它已经死了

如果进程处于活动状态,则通过关闭OutputStream(转到进程的stdin),可以告诉进程没有更多的输入。通过关闭InputStreams(进程的stdout、stderr),进程不再向这些流写入数据(如果尝试,它将获得SIGPIPE)


当进程死亡时,Java将缓冲来自stdout/stderr的剩余数据,并为您关闭所有三个流(它正在运行“ProcessReaper”线程,进程死亡时会通知该线程)。任何写入OutputStream的尝试都将失败。从InputStream读取将返回缓冲数据(如果有)。关闭任何一个都没有好处,但也不会造成伤害。(此时基本文件描述符已关闭)。

您没有关闭未打开的流-这是一个令人讨厌的副作用。
如果您创建了进程,请先杀死它,然后关闭流。

IOUtils.closequity(is)将处理try{is.close();}catch(Exception ignore){}“当进程死亡时,该输入流不会自动消失”——当您启动一个进程时,Java正在运行“process reaper”线程,在这种情况下,它会关闭管道的局部。你能备份它吗?这是一个有趣的话题,你的答案很详细。谢谢。关闭输入流肯定会清除缓冲区吗?i、 e.如果进程已停止,但缓冲区中有未读数据,那么在关闭InputStream时,是否一定会将其从缓冲区中删除?