不关闭字节流的后果

时间:2014-02-25 17:02:40

标签: java stream byte

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

我们非常强调要始终这样做,但没有提及它是如何导致问题的。 有人可以解释实际发生的事情吗?

4 个答案:

答案 0 :(得分:2)

这不仅仅是字节流。这涉及实施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但可以买得起Guava,请使用Closer

答案 1 :(得分:0)

它会挂在GC收集的util上。 (因此持有非托管资源(文件,套接字等)

答案 2 :(得分:0)

有几个流包括:

  • 的ByteArray
  • 文件
  • 过滤
  • 对象
  • 管道式
  • 输出流的Corba版本

根据流后面的资源类型,结果可能会有所不同。在ByteArrayInputStreamByteArrayOutputStream文档中说明:

  

关闭ByteArrayInputStream无效。这个方法   在没有关闭流之后可以调用class   生成IOException。

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

答案 3 :(得分:0)

不关闭有限的资源(例如数据库连接)会大大减慢执行速度,并且可能会因为这些连接耗尽而导致错误,而旧的连接未使用。

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

这是与@fge所述的所有Closeable相关的主要话题。有许多图书馆提供诸如connection poolscaches之类的内容来处理此类问题。

更多信息:

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