Нужно ли закрывать () как FileReader, так и BufferedReader?
Я читаю локальный файл, используя BufferedReader, обернутый вокруг FileReader:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
мне нужно close() the FileReader а также, или обертка будет обрабатывать это?
Я видел код, где люди делают что-то вроде этого:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
этот метод вызывается из сервлета, и я хочу убедиться, что я не оставляют ручки открытыми.
7 ответов:
нет.
BufferedReader.close()закрывает поток согласно javadoc для BufferedReader и InputStreamReader
а также
FileReader.close()делает.
как указывали другие, вам нужно только закрыть внешнюю обертку.
BufferedReader reader = new BufferedReader(new FileReader(fileName));существует очень тонкий шанс, что это может привести к утечке дескриптора файла, если
BufferedReaderконструктор выдал исключение (напримерOutOfMemoryError). Если ваше приложение находится в этом состоянии, насколько тщательной должна быть ваша очистка, может зависеть от того, насколько важно, чтобы вы не лишали ОС ресурсов, которые она может захотеть выделить другим программам.The выходит интерфейс может быть использован, если конструктор обертки, вероятно, потерпит неудачу в Java 5 или 6:
Reader reader = new FileReader(fileName); Closeable resource = reader; try { BufferedReader buffered = new BufferedReader(reader); resource = buffered; // TODO: input } finally { resource.close(); }Java 7 код должен использовать try-with-resources шаблон:
try (Reader reader = new FileReader(fileName); BufferedReader buffered = new BufferedReader(reader)) { // TODO: input }
согласно источнику BufferedReader, в этом случае bReader.волосок fReader.закрыть так что технически вам не придется звонить последнему.
исходный код BufferedReader показывает, что базовый закрывается при закрытии BufferedReader.
после проверки исходного кода, я обнаружил, что для примера:
FileReader fReader = new FileReader(fileName); BufferedReader bReader = new BufferedReader(fReader);метод close () on BufferedReader объект вызовет абстрактный метод close () из читатель класс, который в конечном итоге вызовет реализованный метод в InputStreamReader класс, который затем закрывает InputStream
начиная с Java 7 Вы можете использовать try-with-resources заявление
try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); }- за
BufferedReaderэкземпляр объявляется в операторе try-with-resource, он будет закрыт независимо от того, завершается ли оператор try нормально или резко. Так что вам не нужно закрывать его самостоятельно вfinallyзаявление. (Это также относится к вложенным операторам ресурсов)это рекомендуемый способ работы с ресурсами, см. документация для получения более подробной информации
Comments