这个问题说明了一切。 不关闭各种字节流有什么后果?
我们非常强调要始终这样做,但没有提及它是如何导致问题的。 有人可以解释实际发生的事情吗?
答案 0 :(得分:2)
这不仅仅是字节流。这涉及实施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但可以买得起Guava,请使用Closer
。
答案 1 :(得分:0)
它会挂在GC收集的util上。 (因此持有非托管资源(文件,套接字等)
答案 2 :(得分:0)
有几个流包括:
根据流后面的资源类型,结果可能会有所不同。在ByteArrayInputStream和ByteArrayOutputStream文档中说明:
关闭ByteArrayInputStream无效。这个方法 在没有关闭流之后可以调用class 生成IOException。
但在FileInputStream中有一个打开的文件。如果您将其保持打开状态,则会保留内存,并且任何尝试编辑该文件的人都会将其锁定。如有疑问,请始终调用close()方法。
答案 3 :(得分:0)
不关闭有限的资源(例如数据库连接)会大大减慢执行速度,并且可能会因为这些连接耗尽而导致错误,而旧的连接未使用。
不关闭文件流可能导致多个线程写入同一文件,或者文件未正确终止,或者文件在另一个线程尝试写入或读取时被锁定。
这是与@fge所述的所有Closeable
相关的主要话题。有许多图书馆提供诸如connection pools和caches之类的内容来处理此类问题。
更多信息:
https://www.google.com/search?q=consequentes+of+not+closing+resources+java