我在文档中没有找到这个问题的明确解释。
但是当我们有一个Process
对象并调用getInputStream()
时,
我们是否得到一个新的流,当我们完成后应该明确关闭它? 还是 我们得到已经与进程相关联的流,我们不应该关闭它,但进程会负责关闭它?
基本上,我们应该如何与从Process.getInputStream()
获得的流进行交互?关闭还是不关闭?
我在文档中没有找到这个问题的明确解释。
但是当我们有一个Process
对象并调用getInputStream()
时,
我们是否得到一个新的流,当我们完成后应该明确关闭它? 还是 我们得到已经与进程相关联的流,我们不应该关闭它,但进程会负责关闭它?
基本上,我们应该如何与从Process.getInputStream()
获得的流进行交互?关闭还是不关闭?
从阅读UNIXProcess.java代码来看,以下是发生的情况:
我们需要区分两种状态:进程仍在运行,或者它已经死亡。
如果进程仍在运行,通过关闭输出流(流向进程的标准输入),您正在告诉进程没有更多的输入。通过关闭输入流(进程的标准输出和标准错误),进程将不能再向这些流写入数据(如果尝试写入数据,则会收到SIGPIPE信号)。
当进程终止时,Java将缓冲剩余的stdout / stderr数据,并为您关闭所有三个流(它正在运行“进程收割者”线程,该线程在进程死亡时被通知)。任何试图写入OutputStream的尝试都将失败。如果有缓冲的数据,从InputStream读取将返回这些数据。关闭其中任何一个流没有好处,也不会造成任何损失。(底层文件描述符此时已关闭)。
我的第一反应是关闭它,因为你打开的流总是要关闭的。我确实意识到文档不够完善,但既然它们没有明确说明不要关闭,那对我来说就意味着要遵循良好的编程实践。
InputStream is = process.getInputStream()
try {
// your code
} finally {
try { is.close(); } catch (Exception ignore) {}
}
如果您需要确保这没有问题,只需编写一个快速的测试用例,在该测试用例中从输入流中多次读取数据,每次打开和关闭InputStream即可。
Process.getInputStream()
时,你会得到一个已经为该进程设置好的现有输入流。当进程结束时,该输入流不会自动消失 - 把它想象成一个你仍然可以读取的缓冲区。管道的进程端可能关闭了,但你的端口没有。虽然垃圾回收最终会处理它,但关闭它是你的责任。getErrorStream()
和 getOutputStream()
。如果您没有打开流,则不要关闭它们-这是一个令人讨厌的副作用。如果您创建了该进程,请先终止它,然后再关闭流。
我总是关闭它们!虽然我不确定,但据我所知,如果你保持输入流打开,文件将一直保持打开状态,直到你关闭它!因此,请遵循“标准规则”并关闭它!参考以下示例: Process Builder waitFor() issue and Open file limitations