Для чего предназначен интерфейс `Closeable` в Java?

Ответ

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

Основное использование — блок try-with-resources (Java 7+):

// Ресурсы, объявленные в try, автоматически закрываются после выхода из блока
// даже в случае исключения. Все они должны реализовывать AutoCloseable.
try (FileInputStream fis = new FileInputStream("data.bin");
     BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
    // Работа с ресурсами
    String line = br.readLine();
    // ...
} // Здесь неявно вызывается close() для fis и br
catch (IOException e) {
    // Обработка исключений, включая те, что могли вылететь из close()
}

Отличие от java.lang.AutoCloseable:

Характеристика Closeable (с Java 1.5) AutoCloseable (с Java 7)
Пакет java.io java.lang
Цель Специализирован для операций I/O Универсальный механизм для любых ресурсов
Исключение close() Только IOException Любое Exception
Наследование Расширяет AutoCloseable Базовый интерфейс

Важные правила:

  1. Closeable является подтипом AutoCloseable, поэтому любой Closeable-ресурс можно использовать в try-with-resources.
  2. Метод close() должен быть идемпотентным: многократный вызов close() на одном объекте не должен приводить к ошибкам.
  3. Все стандартные классы для работы с I/O (InputStream, OutputStream, Reader, Writer, Socket, Connection) реализуют Closeable.

Практический совет: Всегда используйте try-with-resources для управления ресурсами. Это гарантирует их закрытие и делает код чище и безопаснее, чем ручной вызов close() в блоке finally.

Ответ 18+ 🔞

А, ну это про тот самый интерфейс, который все эти файловые потоки и прочую хуйню закрывает! java.io.Closeable, блядь. Суть его проще пареной репы, хоть и звучит страшно.

Представь, ты открыл кучу файлов, сетевых соединений — это всё системные ресурсы, их вёдрами не раздают. Их надо за собой прибрать, как за собакой нахуй. Вот для этой явной уборки он и нужен, содержит один-единственный метод void close() throws IOException. Вызвал — и ресурс освободил, красота.

Но главная магия началась с Java 7, с появлением блока try-with-resources. Это просто ёперный театр удобства, я тебе скажу!

// Объявляешь ресурсы прямо в скобках — и они закроются сами, даже если посередь кода пиздец случится.
try (FileInputStream fis = new FileInputStream("data.bin");
     BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
    // Работай тут, не бойся
    String line = br.readLine();
    // ...
} // А тут, за кулисами, за тебя тихо вызовут close() и на fis, и на br. Волшебство, блядь!
catch (IOException e) {
    // Ловишь исключения, в том числе и от самого закрытия.
}

Теперь про разницу двух интерфейсов, а то народ путается. Есть старый Closeable (из java.io), а есть новый, универсальный AutoCloseable (из java.lang). Смотри, как они друг на друге едут:

Признак Closeable (Java 1.5) AutoCloseable (Java 7)
Откуда взялся Из мира ввода-вывода Из мира вообще всех ресурсов
Что бросает close() Только IOException Любое Exception, хоть своё ебаное
Кто кого Он теперь сын AutoCloseable Он папаша, базовый интерфейс

Короче, Closeable — это такой специализированный AutoCloseable для I/O. Поэтому любой твой файловый поток или сокет спокойно влезает в try-with-resources.

Запомни три железных правила, чтобы не выглядеть мудаком:

  1. Closeable — это подвид AutoCloseable, так что всю свою I/O-братию можно пихать в авто-закрывающийся блок.
  2. Метод close() должен быть идемпотентным. Это умное слово значит, что если ты его вызовешь сто раз, хуже не станет. Закрыл — ок. Ещё раз закрыл — тоже ок, а не пиздец и падение.
  3. Всё, с чем ты обычно работаешь — InputStream, OutputStream, сокеты, соединения с БД — всё это реализует Closeable.

И главный практический совет, на котором я готов подписаться кровью: ВСЕГДА используй try-with-resources. Это в миллиард раз надёжнее, чем самому в finally вызывать close(), забыть, перепутать или накосячить. Код чище, безопаснее, и совесть не грызёт, как у того Герасима из «Муму», блядь.