2

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

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

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

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

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

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

4

1 回答 1

5

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

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

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

于 2013-05-07T11:43:41.623 回答