Зачем в Java необходимо явно закрывать ресурсы (файлы, соединения)?

«Зачем в Java необходимо явно закрывать ресурсы (файлы, соединения)?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Явное закрытие ресурсов (файлов, сетевых соединений, потоков ввода-вывода) критически важно по нескольким причинам:

  • Предотвращение утечек ресурсов: Неосвобожденные дескрипторы файлов или сокеты остаются занятыми, что может привести к ошибке java.io.IOException: Too many open files.
  • Освобождение системных ресурсов: Операционная система выделяет ограниченное количество ресурсов на процесс.
  • Гарантия записи данных: Для буферизованных потоков (например, BufferedWriter) вызов close() гарантирует сброс буфера и физическую запись данных.
  • Снятие блокировок: Открытый файл может быть заблокирован для записи другими процессами.

Best Practice в Java 7+: Используйте try-with-resources для автоматического закрытия любых ресурсов, реализующих интерфейсы AutoCloseable или Closeable.

try (FileInputStream fis = new FileInputStream("data.bin");
     BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
    String line = reader.readLine();
    // Работа с ресурсами
} // fis и reader будут закрыты автоматически здесь, даже при исключении

Почему это работает: Блок try-with-resources неявно добавляет блок finally, который вызывает close() для всех объявленных ресурсов в обратном порядке их инициализации.