Вопрос

Я читаю локальный файл, используя 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();

Этот метод вызывается из сервлета, и я хотел бы убедиться, что я не оставляю открытыми какие-либо дескрипторы.

Это было полезно?

Решение

нет.

BufferedReader.close()

закрывает поток согласно Javadoc для БуферизованныйReader и ИнпутStreamReader

а также

FileReader.close()

делает.

Другие советы

Как отмечали другие, вам нужно только закрыть внешнюю обертку.

BufferedReader reader = new BufferedReader(new FileReader(fileName));

Существует очень малая вероятность того, что это может привести к утечке дескриптора файла, если BufferedReader конструктор выдал исключение (например. OutOfMemoryError).Если ваше приложение находится в этом состоянии, то, насколько тщательной должна быть очистка, может зависеть от того, насколько важно не лишить ОС ресурсов, которые она может захотеть выделить другим программам.

Тем Закрываемый интерфейс можно использовать, если конструктор-оболочка в 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 (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}

Согласно источнику BufferedReader, в этом случае bReader.close вызывает fReader.close, поэтому технически вам не нужно вызывать последний.

Исходный код для БуферизованныйReader показывает, что базовый объект закрывается при закрытии BufferedReader.

Проверив исходный код, я обнаружил, что для примера:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

метод close() на БуферизованныйReader объект будет вызывать абстрактный метод close() Читатель класс, который в конечном итоге вызовет реализованный метод в ИнпутStreamReader класс, который затем закрывает Входной поток объект.

Итак, достаточно только bReader.close().

Начиная с Java 7, вы можете использовать Заявление о попытке с ресурсами

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

Поскольку BufferedReader экземпляр объявлен в операторе try-with-resource, он будет закрыт независимо от того, завершится ли оператор try нормально или внезапно.Поэтому вам не нужно закрывать его самостоятельно в finally заявление.(Это также относится к вложенным операторам ресурсов)

Это рекомендуемый способ работы с ресурсами, см. документация для более подробной информации

Вам нужно только закрыть буферизованныйReader, т.е. read.close(), и он будет работать нормально.

Я опоздал, но:

BufferReader.java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

Ты Не необходимо закрыть завернутую программу чтения/записи.

Если вы просмотрели документацию (Reader.close(),Writer.close()), Вы увидите это в Reader.close() там написано:

Закрывает поток и освобождает все связанные с ним системные ресурсы.

В котором просто говорится, что он «освобождает любые системные ресурсы связанный с этим".Хоть это и не подтверждает..это подталкивает вас начать смотреть глубже.и если ты пойдешь в Writer.close() он только утверждает, что закрывается сам.

В таких случаях мы обращаемся к OpenJDK чтобы взглянуть на исходный код.

В BufferedWriter Линия 265 вот увидишь out.close().Значит не закрывается..Это нечто другое.Если вы ищете в классе вхождения "out" вы заметите, что в конструкторе Строка 87 что out является писателем, который класс обертывает, где он вызывает другой конструктор, а затем назначает out собственный параметр out переменная..

Так..А как насчет других?Вы можете увидеть аналогичный код на Буферизованная строка чтения 514, Строка BufferedInputStream 468 и Строка InputStreamReader 199.Других я не знаю, но этого должно быть достаточно, чтобы предположить, что они знают.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top