【问题标题】:Does unreferenced Scanner object close automatically?未引用的 Scanner 对象会自动关闭吗?
【发布时间】:2020-12-15 23:43:17
【问题描述】:

此问题与question 重复,但如果可以关闭,则没有人回答。

他们只提出了替代方案 - 使用 try-with 或实际上有像 Scanner scanner=new Scanner(System.in) 这样的参考。

这导致我认为无法关闭未引用的 Scanner 对象但是...

问题:对象不应该成为符合条件垃圾收集,因此最终会被关闭吗?
(注意:我确实意识到依赖 GC 并不是一个好主意)

【问题讨论】:

  • Scanner 不会自动关闭。请注意,在此处关闭 scanner也会关闭 System.in(这是一个全局变量)。

标签: java garbage-collection java.util.scanner


【解决方案1】:

查看the OpenJDK sourceScanner 不会覆盖finalize 方法。这意味着最终收集对象时不会执行任何特殊代码,您需要显式关闭它。

编辑:
这可能是故意的,因为Scanner 的一个常见用例是在System.in 上使用它,你永远不应该关闭它。

【讨论】:

  • 简单来说就是对象被垃圾回收了,但是底层流还是打开的?
  • @HelloWorld 是的,完全正确
  • 一般来说,包装另一个资源对象的对象永远不会有终结器关闭它们,因为包装器总是有可能在底层资源仍在使用时被垃圾收集,例如this Q&A。因此,Scanner 没有终结器或清理器,而是底层资源,例如包装FileInputStream 时,可能有。尽管如此,这并不是依赖垃圾收集资源的邀请。 System.inis special的案例……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多