Какую функциональность определяет интерфейс Closeable в Java?

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

Ответ

Интерфейс java.io.Closeable определяет, что ресурс (файл, сетевое соединение, поток) должен быть закрыт после использования для освобождения системных ресурсов. Он содержит единственный метод:

void close() throws IOException;

Ключевые моменты:

  • Назначение: Гарантированное освобождение ресурсов (дескрипторы файлов, сокеты).
  • Идиоматическое использование: Вместе с try-with-resources (появился в Java 7), который гарантирует вызов close().

Пример с try-with-resources:

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

Отличие от AutoCloseable:

  • AutoCloseable (пакет java.lang) — более общий интерфейс, появившийся в Java 7 для поддержки try-with-resources. Его метод close() бросает Exception.
  • Closeable (пакет java.io) — специализированный подкласс AutoCloseable для I/O операций. Его метод close() бросает только IOException. Все классы, реализующие Closeable, автоматически совместимы с try-with-resources.