我在文档中找不到对此的说明。 但是,当我们有一个Process
对象,并调用getInputStream()
,正确地从getInputStream中关闭Java Process InputStream
,我们会得到我们应该明确地接近,当我们用它做一个新的流? 或 我们是否已经获得了与流程关联的流,我们不应该关闭,但流程会关注它吗?
基本上,我们应该如何与我们从Process.getInputStream()
获得流互动?关闭还是不关闭?
我在文档中找不到对此的说明。 但是,当我们有一个Process
对象,并调用getInputStream()
,正确地从getInputStream中关闭Java Process InputStream
,我们会得到我们应该明确地接近,当我们用它做一个新的流? 或 我们是否已经获得了与流程关联的流,我们不应该关闭,但流程会关注它吗?
基本上,我们应该如何与我们从Process.getInputStream()
获得流互动?关闭还是不关闭?
我的第一反应是关闭它,你总是关闭你打开的流。我意识到文档没有达到标准,但由于他们没有明确说明请不要关闭对我而言,这意味着遵循良好的编程习惯。
InputStream is = process.getInputStream()
try {
// your code
} finally {
try { is.close(); } catch (Exception ignore) {}
}
如果您需要确保这是没有问题的,只写了一个快速测试情况下你带来很大的输入流中几十个次,每次打开和关闭的InputStream。
我总是关闭它们!我不是100%肯定的,但据我所知,如果你将输入流打开,文件将被打开,直到你关闭它!因此请遵循“标准规则”并关闭它!请按照以下示例进行操作: Process Builder waitFor() issue and Open file limitations
当您拨打Process.getInputStream()
时,您将获得为该过程设置的现有输入流。当进程死亡时,输入流确实是而非会自动消失 - 将其视为可以读取的缓冲区。该进程的管道末端可能会关闭,但您的结束不是。关闭它是你的责任,尽管GC最终会得到它。
您还应该关闭其他两个:getErrorStream()
和getOutputStream()
。
“当进程死亡时,输入流不会自动消失” - 当您启动进程时,Java正在运行“进程收割者”线程,该线程将关闭此类管道的本地端这个案例。 –
还是我们获得与 处理有关的已经存在的数据流,我们不应该关闭,但这个过程会照顾 关闭它?
没有的Javadoc是这么说的,是吗?
从阅读UNIXProcess.java,这是发生了什么:
我们需要两个状态之间进行区分:要么进程还活着,或者死了。
如果过程是活的,通过关闭的OutputStream(转到过程的标准输入),你说的是过程,有没有为它更多的投入。通过关闭InputStreams(进程的stdout,stderr),进程不再写入这些(如果它尝试,它将得到SIGPIPE)。
当进程终止时,Java将缓冲从标准输出/标准错误剩余的数据,并关闭所有三个流为你(正在运行“的过程收割者”线程,这是在过程中死亡通知)。任何尝试写入OutputStream都将失败。从InputStream中读取将返回缓冲的数据(如果有的话)。关闭他们中的任何一个都没有好处,但也不会造成伤害。 (底层文件描述符在这个时候关闭)。
你不关闭溪流,你没有打开 - 这是一个讨厌的副作用。 如果您创建了该流程,那么先杀掉它,然后关闭流。
IOUtils.closeQuietly(is)将照顾try {is.close(); } catch(Exception ignore){} – Kirby