不关闭字节流的后果



这个问题说明了一切。不关闭各种字节流的后果是什么?

非常强调始终这样做,但没有提到它如何引起问题。有人可以解释一下实际发生了什么吗?

这不仅仅是字节流。这涉及任何实现Closeable

如文档所述:

调用 close 方法以释放对象持有的资源(如打开的文件)。

无论Closeable是否拥有系统资源,经验法则是:不要冒险。 正确.close(),您将确保释放此类系统资源(如果有)。

典型的成语(注意InputStream实现Closeable):

final InputStream in = whateverIsNeeded;
try {
    workWith(in);
} finally {
    in.close();
}

在 Java 7 中,您还具有 AutoCloseableCloseable 实现)和 try-with-resources 语句,因此:

try (
    final InputStream in = whateverIsNeeded;
) {
    workWith(in);
}

这将为您处理关闭in

再说一遍:不要冒险。如果您不使用JDK 7但买得起番石榴,请使用Closer

不关闭有限的资源(如数据库连接)将大大减慢执行速度,并可能导致错误,因为这些连接用完,旧的连接在那里闲置。

不关闭文件流可能会导致多个线程写入同一文件,或者文件未正确终止,或者在另一个线程尝试写入或读取文件时锁定文件。

正如@fge所说,这是一个与所有Closeable有关的主要主题。有许多库提供诸如连接池和缓存之类的东西来处理此类问题。

更多信息:

https://www.google.com/search?q=consequentes+of+not+closing+resources+java

它将挂在GC收集的util周围。(因此保留非托管资源(文件、套接字等)

有几个流,包括:

  • 字节数组
  • 文件
  • 滤波器
  • 对象
  • 管道
  • 输出流的 Corba 版本

根据流背后的资源类型,结果可能会有所不同。InByteArrayInputStream 和 ByteArrayOutputStream,其中文档说:

关闭 ByteArrayInputStream 不起作用。这里的方法 类可以在流关闭后调用,而无需 生成 IOException。

但是在FileInputStream中有一个打开的文件。如果您将其保持打开状态,则会保留内存,任何尝试编辑该文件的人都会发现它已锁定。如有疑问,请始终调用 close() 方法。

相关内容

  • 没有找到相关文章

最新更新