我在文档中找不到对此的澄清。
但是当我们有Process
个对象并致电getInputStream()
时,
我们是否会获得一个我们应该在完成后明确关闭的新流? 要么 我们是否得到了与流程相关的流,我们不应该关闭流程,但流程是否会关闭它?
基本上,我们应该如何与来自Process.getInputStream()
的流进行交互?关闭还是不关闭?
答案 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)
你没有关闭你没有打开的溪流 - 这是一个令人讨厌的副作用。 如果您创建了该进程,请先将其终止并在此之后关闭流。