2013-05-07 3 views
1

Я спросил this question yesterday. Думаю, у меня есть правильный ответ, но один из других ответов оставил мне вопрос. Если у меня есть такой код:Является ли сканер Java закрытым?

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

Является ли это так? Из того, что я понимаю try-with-resources заявление закроет ресурс, если этот ресурс реализует Closeable или AutoCloseable. На мой взгляд, я приравниваю это к использованию с оператором для открытия файловых ресурсов в Python. Но ответ от @David Newcomb говорит, что сканер не Closeable.

Я смотрел на источник Java, и я нашел строчку:

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

Это значит для меня, что я в безопасности с помощью примерочных с-ресурсами и что файл ресурсов будет закрыт в конце блока try без явного вызова file.close(). Я прав, или я должен делать что-то по-другому?

+2

В Java есть эта замечательная вещь, о которой рассказывал javadoc, в котором рассказывается, какие интерфейсы каждый класс реализует: http://docs.oracle.com/javase/6/docs/api/ –

+0

Это не «замечательная вещь» или ответьте на мой вопрос. Также интересно отметить, хотя, поскольку вы указали, что, согласно javadoc, java6 Scanner не реализует Closeable, но Java7 делает. – noel

+2

Вы спрашиваете, хотите ли вы вызвать файл file.close(). Посмотрите на javadoc файла, и вы увидите, что он не имеет никакого метода clsoe() и не реализует Closeable. Посмотрите на javadoc сканера, и вы увидите, что он реализует Closeable. –

ответ

5

Итак, теперь мы не сомневаемся, что при попытке использовать ресурсы вызовет Scanner.close(). Теперь рассмотрим API Scanner.close:

Если этот сканер еще не закрыт, то если его базовый читаемый также реализует интерфейс Closeable, тогда будет вызываться метод закрытия readable.

Поскольку сканер был создан с аргументом File, он создаст FileInputStream внутренне и закроет его автоматически. Объект File не нуждается в закрытии, поскольку он не является ресурсом Closeable.

+0

Я отредактировал мой вопрос. Спасибо за ваше время. – noel

+0

ОК отредактировал мой ответ –

+0

Это то, о чем я тоже думал. Я просто хотел запустить его еще несколько опытных Java-парней. – noel