Java-проба с ресурсами
Попробуйте ресурсы Java
В этом руководстве мы узнаем об операторе try-with-resources для автоматического закрытия ресурсов.
try-with-resources
оператор автоматически закрывает все ресурсы в конце оператора. Ресурс — это объект, который необходимо закрыть в конце программы.
Его синтаксис:
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
Как видно из приведенного выше синтаксиса, мы объявляем try-with-resources
заявление,
- объявление и создание экземпляра ресурса в
try
пункт. - указание и обработка всех исключений, которые могут возникнуть при закрытии ресурса.
Примечание. Оператор try-with-resources закрывает все ресурсы, реализующие интерфейс AutoCloseable.
<час> Давайте возьмем пример, который реализует try-with-resources
заявление.
Пример 1:попробуйте с ресурсами
import java.io.*;
class Main {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
Вывод, если файл test.txt не найден.
IOException in try-with-resources block =>test.txt (No such file or directory)
Вывод, если файл test.txt найден.
Entering try-with-resources block Line =>test line
В этом примере мы используем экземпляр BufferedReader. для чтения данных из test.txt
файл.
Объявление и создание экземпляра BufferedReader внутри try-with-resources
Оператор гарантирует, что его экземпляр будет закрыт независимо от того, находится ли try
Оператор завершается нормально или выдает исключение.
Если возникает исключение, его можно обработать с помощью блоков обработки исключений или ключевого слова throws.
<час>Подавленные исключения
В приведенном выше примере исключения могут быть вызваны из try-with-resources
заявление, когда:
- Файл
test.txt
не найден. - Закрытие
BufferedReader
объект.
Исключение также может быть вызвано из try
блокировать, так как чтение файла может завершиться ошибкой по многим причинам в любое время.
Если исключения генерируются как из try
блок и try-with-resources
заявление, исключение из try
выдается блок и исключение из try-with-resources
оператор подавлен.
Получение подавленных исключений
В Java 7 и более поздних версиях подавленные исключения можно получить, вызвав функцию Throwable.getSuppressed()
. метод из исключения, вызванного try
блокировать.
Этот метод возвращает массив всех подавленных исключений. Мы получаем подавленные исключения в catch
блокировать.
catch(IOException e) {
System.out.println("Thrown exception=>" + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (int i=0; i<suppressedExceptions.length; i++) {
System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
}
}
<час> Преимущества использования try-with-resources
Вот преимущества использования попытки с ресурсами:
1. блок finally не требуется для закрытия ресурса
До того, как Java 7 представила эту функцию, нам приходилось использовать finally
заблокировать, чтобы убедиться, что ресурс закрыт, чтобы избежать утечки ресурсов.
Вот программа, похожая на Пример 1. . Однако в этой программе мы использовали блок finally для закрытия ресурсов.
Пример 2. Закрытие ресурса с помощью блока finally
import java.io.*;
class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("test.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block =>"+e.getMessage());
}
}
}
}
Вывод
Entering try block Line =>line from test.txt file Entering finally block
Как видно из приведенного выше примера, использование finally
блок очистки ресурсов усложняет код.
Обратите внимание на try...catch
блок в finally
тоже блокировать? Это связано с тем, что IOException
также может произойти при закрытии BufferedReader
экземпляр внутри этого finally
заблокировать, чтобы он также был перехвачен и обработан.
try-with-resources
оператор выполняет автоматическое управление ресурсами . Нам не нужно явно закрывать ресурсы, поскольку JVM автоматически закрывает их. Это делает код более читабельным и простым в написании.
2. попробуйте с ресурсами с несколькими ресурсами
Мы можем объявить более одного ресурса в try-with-resources
оператора, разделяя их точкой с запятой ;
Пример 3:попробуйте использовать несколько ресурсов
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
}
}
Если эта программа выполняется без каких-либо исключений, Scanner
объект читает строку из testRead.txt
файл и записывает его в новый testWrite.txt
файл.
Когда делается несколько объявлений, try-with-resources
Оператор закрывает эти ресурсы в обратном порядке. В этом примере PrintWriter
сначала закрывается объект, а затем Scanner
объект закрыт.
Улучшение функции "проба с ресурсами" в Java 9
В Java 7 есть ограничение на try-with-resources
утверждение. Ресурс должен быть объявлен локально в его блоке.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
// code
}
Если бы мы объявили ресурс вне блока в Java 7, это сгенерировало бы сообщение об ошибке.
Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
// code
}
Чтобы справиться с этой ошибкой, в Java 9 улучшен код try-with-resources
. оператор, чтобы можно было использовать ссылку на ресурс, даже если он не объявлен локально. Приведенный выше код теперь будет выполняться без ошибок компиляции.
java