Java扫描程序是否实现了Closeable?

时间:2013-05-07 11:39:11

标签: java try-with-resources

我问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() 我是对的,还是应该以不同的方式做某事?

1 个答案:

答案 0 :(得分:5)

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

  

如果此扫描程序尚未关闭,那么如果其底层可读也实现了Closeable接口,那么将调用可读的close方法。

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