【问题标题】:Why is Scanner.close() useful in Java?为什么 Scanner.close() 在 Java 中很有用?
【发布时间】:2017-03-28 04:44:52
【问题描述】:

我知道它是为了资源而运作的。 但是如果没有检测到进一步的使用,它不会像其他对象一样自动关闭吗? 出于同样的原因,我从不解构单个对象,这是一个坏习惯吗? 非常感谢。

【问题讨论】:

  • 如果它被垃圾回收(实际上不是 Scanner,因为它没有实现 finalize,但 FileInputStream 实现),它将被关闭,当需要比当前可用的更多内存时会发生这种情况。如果你有很多内存,那可能会在你用完可用的文件描述符之后很久很久。
  • 垃圾收集可能永远不会发生。您不得依赖 GC 为您释放资源。 @yshavit 确实,这是一个非常严重的错误,我正在重新评论。

标签: java java.util.scanner


【解决方案1】:

Scanner 打开底层操作系统的文件描述符(或文件通道或流),通常以非托管(通常为C 语言)编写。

一个流保持打开,有时可以保持打开直到内核决定关闭它(例如,在程序完成执行之后......高度依赖于实现)。

因此,明确关闭资源是个好主意。

【讨论】:

    【解决方案2】:

    java.util.Scanner.close() 方法关闭此扫描器。如果此扫描器尚未关闭,则如果其底层可读也实现了Closeable 接口,则将调用可读的关闭方法。如果此扫描器已关闭,则调用此方法将无效。

    【讨论】:

      【解决方案3】:

      我们需要关闭扫描仪,因为

      1. 它将底层可读对象(输入源)清空以帮助进行垃圾回收。
      2. 不允许对扫描仪对象进行进一步操作,这将导致 iIllegalStateException。

      因此,建议使用 close()。

      【讨论】:

        【解决方案4】:

        创建新的 Scanner 时,从技术上讲,您持有对资源的引用。假设我们正在使用 InputStream 读取文件,您将拥有一个指向 InputStream 对象的指针。

        当我们读完对象/文件并且处理程序仍然打开时,即使我们不需要它,我们仍在引用该对象。显式调用 close 要求释放资源,因为我们没有使用它。 这让我们更容易一些 - 如果我们对资源有限制(例如:对 DB 的限制,允许 500 次读取)以及 GC 更容易,因为未使用的引用被释放并且可能需要更少的时间。

        一种更好的想象方式,在 SQLConnection 中。如果您不使用它,为什么要保持一个连接?

        【讨论】:

          猜你喜欢
          • 2014-12-02
          • 1970-01-01
          • 2010-12-12
          • 2015-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-09
          • 2013-08-28
          相关资源
          最近更新 更多