【问题标题】:Consequences of not closing byte streams不关闭字节流的后果
【发布时间】:2014-02-25 17:02:40
【问题描述】:

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

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

【问题讨论】:

  • “字节流”是什么意思?对于ByteArrayInputStream,影响不大。对于 FileInputStream 或来自套接字的,那是另一回事。
  • 我实际上是在问一般情况。我在参考文档时遇到了这个问题:Byte Streams
  • 嗯,一般来说没有正确答案,因为它取决于特定类型的流。

标签: java stream byte


【解决方案1】:

这不仅仅是字节流。这涉及任何实现 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

【讨论】:

    【解决方案2】:

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

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

    正如@fge 所述,这是与所有Closeables 相关的主要话题。有许多库提供诸如 connection poolscaches 之类的东西来处理此类问题。

    更多信息:

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

    【讨论】:

      【解决方案3】:

      它将在 GC 收集的 util 周围徘徊。 (因此持有非托管资源(文件、套接字等)

      【讨论】:

        【解决方案4】:

        有几个流,包括:

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

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

        关闭 ByteArrayInputStream 无效。本文中的方法 可以在流关闭后调用类 生成一个 IOException。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-19
          • 2013-02-13
          • 1970-01-01
          • 2019-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-07
          相关资源
          最近更新 更多