【问题标题】:Does Java scanner implement Closeable?Java 扫描器是否实现 Closeable?
【发布时间】:2013-05-01 08:21:18
【问题描述】:

我问了this question yesterday。我想我得到了正确的答案,但其他答案之一给我留下了一个问题。如果我有这样的代码:

File file = new File("somefile.txt");
try (Scanner in = new Scanner(file)) {
    //do something but don't explicitly call file.close()
}

这是错的吗?据我了解,如果资源实现 Closeabletry-with-resources 语句将关闭该资源em>自动关闭。在我看来,我将此等同于使用 with 语句在 Python 中打开文件资源。但是@David Newcomb 的回答说 Scanner 不是 Closeable

我查看了Java源代码,发现了一行:

public final class Scanner implements Iterator<String>, Closeable {

这对我来说意味着我使用 try-with-resources 是安全的,并且文件资源将在 try 块结束时关闭而无需显式调用 file.close() 我是对的还是应该做些不同的事情?

【问题讨论】:

  • Java 有一个很棒的东西叫做 javadoc,它告诉你每个类实现了哪些接口:docs.oracle.com/javase/6/docs/api
  • 这不是一件“好事”,也不是我的问题的答案。另外值得注意的是,因为您指出的是,根据 javadoc,java6 Scanner 不实现 Closeable 但 Java7 实现。
  • 你在问是否应该调用 file.close()。查看 File 的 javadoc,你会发现它没有任何 clsoe() 方法,也没有实现 Closeable。查看Scanner的javadoc,你会发现它实现了Closeable。
  • @shakabra 您会发现 SO 上的某些人并不喜欢将琐碎的逻辑推理外包给他们。在从已有数据中得出明显结论时,在需要解决问题的地方提出问题,而不是在需要安全毯的地方提出问题。您可以通过单击 JDK 源代码来轻松验证这一点,以查看 Scanner.close():grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… 的实现,或者在调试器中单步执行。
  • @millimoose 我不认为让资源保持开放是微不足道的逻辑。 Java 没有什么是显而易见的。感谢您的建设性意见。

标签: java try-with-resources


【解决方案1】:

所以现在我们毫无疑问 try-with-resources 会调用 Scanner.close()。现在让我们看看 Scanner.close API:

如果这个扫描器还没有关闭,那么如果它的底层可读也实现了 Closeable 接口,那么可读的 close 方法将被调用。

由于 Scanner 是使用 File 参数创建的,它将在内部创建 FileInputStream 并自动关闭它。文件对象不需要关闭,因为它不是可关闭的资源。

【讨论】:

  • 我也是这么想的。我只是想让一些更有经验的 Java 人来运行它。
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 2012-10-19
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多