Что такое ресурс в конструкции try-with-resources в Java?

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

Ответ

В Java ресурс в try-with-resources — это любой объект, который должен быть закрыт после использования и реализует интерфейсы java.lang.AutoCloseable или java.io.Closeable.

Принцип работы: Конструкция автоматически вызывает метод close() для каждого объявленного ресурса по завершении блока try (даже при возникновении исключения).

Пример объявления ресурсов:

import java.io.*;

public class Example {
    public static void main(String[] args) {
        // Объявление нескольких ресурсов в try-with-resources
        try (FileInputStream fis = new FileInputStream("input.txt");
             BufferedInputStream bis = new BufferedInputStream(fis);
             FileOutputStream fos = new FileOutputStream("output.txt")) {

            int data;
            while ((data = bis.read()) != -1) {
                fos.write(data);
            }
            // Все ресурсы (fis, bis, fos) будут автоматически закрыты здесь
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

  1. Автоматическое закрытие: Компилятор генерирует блок finally, который вызывает close().
  2. Порядок закрытия: Ресурсы закрываются в порядке, обратном их объявлению (сначала fos, затем bis, затем fis).
  3. Подавленные исключения: Если в блоке try и при закрытии возникли исключения, исключение из блока try является основным, а исключения от close() добавляются к нему как подавленные (доступны через getSuppressed()).

Типичные ресурсы: потоки ввода-вывода (InputStream, OutputStream), соединения с БД (Connection), сессии.