Русский (RU) перевод

Java - Работа с ресурсами с использованием Try with Resources: Руководство для начинающих

Привет, будущие мастера Java! Сегодня мы погружаемся в удобную функцию Java, которая значительно упростит вашу жизнь при работе с ресурсами. Это называется "Try with Resources", и поверьте мне, это станет вашим новым лучшим другом в мире программирования!

Java - try-with-resources

Что такое ресурсы в Java?

Прежде чем перейти к синтаксису try-with-resources, давайте немного подумаем о том, что мы подразумеваем под "ресурсами" в Java. Представьте ресурсы как вещи, которые ваша программа должна взять взаймы у компьютера, чтобы выполнить свою работу. Это могут быть файлы, подключения к базе данных, сетевые сокеты или любая другая внешняя система, с которой ваша программа должна взаимодействовать.

Так же, как когда вы берете книгу в библиотеке, вам нужно вернуть её, когда закончите. В Java我们需要 "закрыть" эти ресурсы после использования. Если мы этого не сделаем, это может привести к различным проблемам, таким как утечки памяти или невозможность других программ доступа к этим ресурсам.

Старый способ: Try-Catch-Finally

До появления try-with-resources в Java 7 мы должны были вручную закрывать наши ресурсы в блоке finally. Посмотрим на пример:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("example.txt"));
    String firstLine = reader.readLine();
    System.out.println(firstLine);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Уф! Для чтения одной строки из файла и обеспечения закрытия reader после этого нужно много кода. Это как заполнять трёхстраничную форму, чтобы взять взаймы карандаш!

Введение: Try with Resources

Теперь посмотрим, как try-with-resources упрощает этот процесс:

try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
    String firstLine = reader.readLine();
    System.out.println(firstLine);
} catch (IOException e) {
    e.printStackTrace();
}

Ниже не получится? Это как магия! Но как это работает?

Как работает Try with Resources

  1. Мы объявляем и инициализируем ресурс (в данном случае, наш BufferedReader) внутри скобок после ключевого слова try.
  2. Java автоматически вызывает метод close() для этого ресурса, когда блок try завершается, независимо от того, завершился он обычным образом или из-за исключения.
  3. Если исключение возникает при закрытии ресурса, оно подавляется, и исключение (если есть) из блока try выбрасывается.

Это как если бы у вас был робот-библиотекарь, который автоматически возвращает вам книги, даже если вы забудете!

Несколько ресурсов

Одна из интересных особенностей try-with-resources заключается в том, что вы можете управлять несколькими ресурсами одновременно. Просто разделите их точкой с запятой:

try (FileInputStream input = new FileInputStream("input.txt");
     FileOutputStream output = new FileOutputStream("output.txt")) {
    // Чтение из input и запись в output
    int data;
    while ((data = input.read()) != -1) {
        output.write(data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

В этом примере и входной, и выходной потоки будут автоматически закрыты при завершении блока try. Это как если бы тот робот-библиотекарь возвращал вам несколько книг одновременно!

Улучшение в Java 9: Эффективно финальные переменные

Java 9 сделала try-with-resources еще лучше. Теперь вы можете использовать переменные, объявленные вне блока try, при условии, что они являются эффективно финальными (то есть их значение не изменяется после инициализации):

BufferedReader reader1 = new BufferedReader(new FileReader("file1.txt"));
BufferedReader reader2 = new BufferedReader(new FileReader("file2.txt"));
try (reader1; reader2) {
    // Использование reader1 и reader2
} catch (IOException e) {
    e.printStackTrace();
}

Это может сделать ваш код еще чище в определенных ситуациях.

Точки для запоминания

Подведем итог, что мы узнали о try-with-resources:

Точка Описание
Автоматическое управление ресурсами Ресурсы автоматически закрываются в конце блока try
Несколько ресурсов Вы можете управлять несколькими ресурсами в одном выражении try-with-resources
Порядок закрытия Ресурсы закрываются в обратном порядке их создания
Подавление исключений Исключения при закрытии подавляются в пользу исключений из блока try
Улучшенная читаемость Код становится гораздо чище и легче для чтения
Улучшение в Java 9 Возможность использования эффективно финальных переменных, объявленных вне блока try

Заключение

Try-with-resources — это как персональный ассистент для вашей программы на Java, который обеспечивает правильное управление всеми ресурсами, не требуя от вас беспокойства по этому поводу. Это фантастическая функция, которая не только делает ваш код чище и более читаемым, но и помогает предотвратить утечки ресурсов.

Помните, хорошее управление ресурсами — это важно в программировании, так же как важно вовремя возвращать книги в библиотеку в реальной жизни. С try-with-resources Java делает это легко быть хорошим гражданином в мире программирования.

Так что идите вперед, мои молодые padawans, и пусть try-with-resources будет с вами на вашем пути в мире Java!

Credits: Image by storyset