从getInputStream正确关闭Java Process InputStream

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

当我们完成它时,我们是否会得到一个我们应该明确关闭的新流? 或者我们是否得到了与流程相关的流,我们不应该关闭流程,但流程是否会关闭它?

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

我的第一反应是关闭它,你总是关闭你打开的溪流。 我确实认为文档不符合标准,但是因为它们没有明确说明不要关闭对我来说意味着遵循良好的编程习惯。

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

如果您需要确保这不成问题,只需编写一个快速测试用例,您可以在输入流中使用几十次,每次打开和关闭InputStream。

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

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

从阅读UNIXProcess.java,这是发生的事情:

我们需要区分两种状态:过程仍然存在,或者它已经死亡。

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

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

我总是把它们关闭! 我不是100%肯定,但据我所知,如果你打开输入流,文件将打开,直到你关闭它! 所以请遵循“标准规则”并关闭它! 按照示例: Process Builder waitFor()问题和打开文件限制

或者我们是否得到了与流程相关的流,我们不应该关闭流程,但流程是否会关闭它?

没有Javadoc这么说,有吗?

你不关闭流,你没有打开 – 这是一个令人讨厌的副作用。 如果您创建了该进程,请先将其终止并在此之后关闭流。