我问this question yesterday。我想我得到了正确的答案,但其中一个答案给我留下了一个问题。如果我有这样的代码:
File file = new File("somefile.txt");
try (Scanner in = new Scanner(file)) {
//do something but don't explicitly call file.close()
}
这是错误的吗?根据我的理解, try-with-resources 语句将关闭资源,如果该资源实现可关闭或< EM> AutoCloseable 。在我看来,我将其等同于使用 with 语句在Python中打开文件资源。但@David Newcomb的回答是,扫描仪并非可关闭。
我查看了Java源代码,我发现了这一行:
public final class Scanner implements Iterator<String>, Closeable {
这对我来说意味着我使用 try-with-resources 是安全的,并且文件资源将在try块的末尾关闭而不显式调用 file.close() 。 我是对的,还是应该以不同的方式做某事?
答案 0 :(得分:5)
所以现在我们毫不怀疑try-with-resources会调用Scanner.close()
。现在让我们看一下Scanner.close API:
如果此扫描程序尚未关闭,那么如果其底层可读也实现了Closeable接口,那么将调用可读的close方法。
由于Scanner是使用File参数创建的,因此它将在内部创建FileInputStream
并自动关闭它。文件对象不需要关闭,因为它不是可关闭的资源。