Безопасное закрытие FileReader и BufferedReader в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Достаточно закрыть BufferedReader, который при освобождении автоматически закроет и FileReader. В версиях Java 7 и выше рекомендуется использовать конструкцию try-with-resources для автоматического освобождения ресурсов:

Java
Скопировать код
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    // работа с br
} // Выход из блока приведет к закрытию обоих ресурсов. Все сделано правильно!
Кинга Идем в IT: пошаговый план для смены профессии

Детализация: Почему достаточно закрыть BufferedReader

Использование BufferedReader для обертывания экземпляра FileReader повышает производительность чтения за счет использования буферизации, что уменьшает количество операций ввода-вывода. BufferedReader управляет жизненным циклом FileReader, так как оба класса реализуют интерфейс Closeable. Поэтому, закрытие BufferedReader освободит и вложенный экземпляр FileReader.

Ретроспектива: До Java 7

До появления Java 7 разработчики были обязаны закрывать каждый ресурс изотированно, используя блок finally:

Java
Скопировать код
BufferedReader br = null;
FileReader fr = null;
try {
    fr = new FileReader("file.txt");
    br = new BufferedReader(fr);
    // чтение данных
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Приветствуем try-with-resources: Фишка Java 7

С появлением Java 7 управление ресурсами значительно упростилось благодаря конструкции try-with-resources, которая автоматически закрывает использованные ресурсы и уменьшает вероятность утечек.

Под контролем: Управление файловыми дескрипторами в сервлетах

В контексте сервлетов аккуратное управление файловыми дескрипторами крайне важно — недостаток внимательности может привести к перегрузке сервера. BufferedReader заботится о закрытии дескрипторов, предотвращая возможные проблемы.

Проблемы: Утечки ресурсов и истощение файловых дескрипторов

Неправильное управление файловыми дескрипторами может привести к их истощению — это ситуация, когда для новых файлов и соединений просто не хватает свободных дескрипторов.

Визуализация

Визуальная интерпретация процесса:

  1. FileReader — предоставляет доступ к содержимому файла.
  2. BufferedReader — обеспечивает буферизированный доступ, ускоряя процесс чтения.

При завершении:

  1. FileReader — заканчивает свою работу.
  2. BufferedReader — автоматически освобождает занятые ресурсы.
Markdown
Скопировать код
📚->🔑: "`BufferedReader` здесь. Я закрою `FileReader`!"

Закрытие BufferedReader.close() гарантирует корректное освобождение всех задействованных ресурсов.

Без паники: Исключения при инициализации ресурсов

Если при инициализации произойдет ошибка, try-with-resources убедится, что уже открытые ресурсы будут закрыты:

Java
Скопировать код
try (
    FileReader fr = new FileReader("file.txt");
    BufferedReader br = new BufferedReader(fr)
) {
    // оба ресурса находятся под контролем
}

Устоявшиеся практики: Работа со старым кодом

В системах с устаревшим кодом, где не используется Java 7, важно корректное использование интерфейса Closeable для безопасного управления ресурсами.

Решили закрепить знания: Лучшие практики

  • Роль блока finally: Перед Java 7 его использование было обязательным.
  • Применяйте вложенные try: Таким образом можно дополнительно контролировать ресурсы в блоке finally.
  • Обратный порядок закрытия ресурсов: Сначала закрывается внешний ресурс, затем — связанные с ним.

Полезные материалы

  1. BufferedReader (Java Platform SE 8)
  2. FileReader (Java Platform SE 8)
  3. java – Нужно ли закрывать и FileReader, и BufferedReader? – Stack Overflow
  4. Оператор try-with-resources (Учебники Java™ > Основные классы Java > Исключения)
  5. Как читать файл в Java построчно | DigitalOcean