Я читаю локальный файл, используя BufferedReader, обернутый вокруг FileReader:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
Нужно ли мне , а также, или будет обертка ручки , что? Я видел код, где люди делают что-то вроде этого:close()
FileReader
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
Этот метод вызывается из сервлета, и я хотел бы убедиться, что я не оставляю открытых дескрипторов.
Ответы:
нет.
закрывает поток в соответствии с javadoc для BufferedReader и InputStreamReader
так же как
делает.
источник
BufferedReader
бросает исключение. Лучше просто закрыть основной поток, хотя вам нужно остерегаться декораторов с другими ресурсами и буферизацией.BufferedReader.close()
закрывает ли основной читатель. Его описание просто скопировано сReader.close()
. Это может быть фактическим поведением на практике, но это не задокументировано.Reader#close()
javadoc не говорит, закрывает ли она это обернутый Reader или нет. Все, что он говорит, относится к тому,Closes the stream and releases any system resources associated with it.
что недостаточно ясно, чтобы сказать, что он закрывает или закрывает ресурс. «Освободить ресурс» может также удалить любую ссылку на ресурс в BufferedReader ... что будет означать, что ресурс не закрыт.Как уже отмечали другие, вам нужно только закрыть внешнюю обертку.
Существует очень малая вероятность того, что это может привести к утечке дескриптора файла, если
BufferedReader
конструктор выдает исключение (напримерOutOfMemoryError
). Если ваше приложение находится в этом состоянии, то насколько тщательной должна быть ваша очистка, может зависеть от того, насколько важно не лишать ОС ресурсов, которые она может захотеть выделить другим программам.Интерфейс Closeable можно использовать, если конструктор-обертка в Java 5 или 6 может потерпеть неудачу:
Код Java 7 должен использовать шаблон try-with-resources :
источник
Согласно источнику BufferedReader, в этом случае bReader.close вызывает fReader.close, поэтому технически вам не нужно вызывать последний.
источник
Исходный код для BufferedReader показывает, что базовый уровень закрывается при закрытии BufferedReader.
источник
Reader#close()
, это не дает конкретного доказательства того, что Oracle JDK, например, реализован в похожая мода.После проверки исходного кода я обнаружил, что для примера:
метод close () объекта BufferedReader будет вызывать абстрактный метод close () класса Reader, который в конечном итоге вызовет реализованный метод в классе InputStreamReader , который затем закроет объект InputStream .
Таким образом, достаточно только bReader.close ().
источник
Начиная с Java 7 вы можете использовать оператор try-with-resources
Поскольку
BufferedReader
экземпляр объявлен в операторе try-with-resource, он будет закрыт независимо от того, завершается ли оператор try нормально или внезапно. Так что вам не нужно закрывать это сами вfinally
заявлении. (Это также касается вложенных операторов ресурсов)Это рекомендуемый способ работы с ресурсами, более подробную информацию смотрите в документации.
источник
Вам нужно только закрыть bufferedReader, т.е. reader.close (), и он будет работать нормально.
источник
Я опоздал, но:
BufferReader.java:
источник
Вам не нужно закрывать завернутый читатель / писатель.
Если вы взглянули на документы (
Reader.close()
,Writer.close()
), вы увидите, что вReader.close()
них написано:Который просто говорит, что он «освобождает любые системные ресурсы, связанные с ним». Даже если это не подтверждает ... это дает вам толчок, чтобы начать смотреть глубже. и если вы идете к
Writer.close()
нему, только утверждает, что он закрывается сам.В таких случаях мы обращаемся к OpenJDK, чтобы взглянуть на исходный код.
На BufferedWriter Line 265 вы увидите
out.close()
. Так что это не закрытие себя .. Это что-то еще. Если вы будете искать в классе вхождения "out
", вы заметите, что в конструкторе в строке 87, которыйout
является писателем, класс переносится туда, где он вызывает другого конструктора, а затем присваиваетout
параметр своей собственнойout
переменной ..Так что .. как насчет других? Вы можете увидеть похожий код в строке BufferedReader 514 , строке BufferedInputStream 468 и строке 199 InputStreamReader . Других я не знаю, но этого должно быть достаточно, чтобы предположить, что они знают.
источник