这个问题说明了一切。不关闭各种字节流的后果是什么?
非常强调始终这样做,但没有提到它如何引起问题。有人可以解释一下实际发生了什么吗?
这不仅仅是字节流。这涉及任何实现Closeable
。
如文档所述:
调用 close 方法以释放对象持有的资源(如打开的文件)。
无论Closeable
是否拥有系统资源,经验法则是:不要冒险。 正确.close()
,您将确保释放此类系统资源(如果有)。
典型的成语(注意InputStream
实现Closeable
):
final InputStream in = whateverIsNeeded;
try {
workWith(in);
} finally {
in.close();
}
在 Java 7 中,您还具有 AutoCloseable
(Closeable
实现)和 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() 方法。