【发布时间】: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()
}
这是错的吗?据我了解,如果资源实现 Closeable 或 try-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 没有什么是显而易见的。感谢您的建设性意见。