从getInputStream正确关闭Java Process InputStream

时间:2011-08-17 18:34:22

标签: java process inputstream

我在文档中找不到对此的澄清。 但是当我们有Process个对象并致电getInputStream()时,

我们是否会获得一个我们应该在完成后明确关闭的新流? 要么 我们是否得到了与流程相关的流,我们不应该关闭流程,但流程是否会关闭它?

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

6 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:0)

我总是关闭它们!我不是100%肯定,但据我所知,如果你打开输入流,文件将打开,直到你关闭它!因此,请遵循"标准规则"并关闭它!举个例子: Process Builder waitFor() issue and Open file limitations

答案 4 :(得分:0)

  

或者我们是否获得了已经存在的流,与之相关联   过程,我们不应该关闭,但过程会照顾   关闭它?

没有Javadoc这样说,是吗?

答案 5 :(得分:0)

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