Что такое интерфейс Closeable в Java?

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

Ответ

Closeable — это интерфейс в Java, предназначенный для освобождения ресурсов, которые требуют явного закрытия (например, файловые потоки, сетевые соединения, сокеты). Он определяет единственный метод close(), который должен освобождать занимаемый ресурс.

Ключевые особенности:

  • Наследует интерфейс AutoCloseable (появился в Java 7).
  • Основное практическое применение — использование в конструкции try-with-resources, которая гарантирует автоматический вызов close() по завершении блока try, даже в случае исключения.

Пример использования с try-with-resources:

// FileInputStream реализует Closeable/AutoCloseable
try (FileInputStream fis = new FileInputStream("data.bin");
     BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
    // Работа с ресурсами
    String line = br.readLine();
    // ...
} // Здесь автоматически вызываются fis.close() и br.close()

Важные отличия от AutoCloseable:

  • Closeable.close() объявляет IOException, в то время как AutoCloseable.close() объявляет более общее Exception.
  • Closeable изначально был предназначен для потоков ввода-вывода, а AutoCloseable расширил эту концепцию на любые ресурсы.

Почему это важно: Неявное закрытие ресурсов может привести к их утечке, что в долгосрочной перспективе вызывает проблемы с производительностью и стабильностью приложения (например, исчерпание файловых дескрипторов или сетевых портов).