Автор оригинала: Pankaj Kumar.
Сегодня мы рассмотрим Java Try с ресурсами. Одной из функций Java 7 является инструкция try-with-resources для автоматического управления ресурсами.
Попробуйте с ресурсами
Ресурс-это объект, который должен быть закрыт, как только ваша программа закончит его использовать. Например, Файл ресурс или JDBC ресурс для подключения к базе данных или Сокет ресурс подключения. До Java 7 не существовало автоматического управления ресурсами, и мы должны явно закрыть ресурс, как только наша работа с ним будет завершена. Обычно это делалось в блоке finally оператора try-catch . Этот подход приводил к утечкам памяти и снижению производительности, когда мы забывали закрыть ресурс.
Давайте посмотрим фрагмент псевдокода, чтобы понять эту функцию java try with resources.
До Java 7 :
try{
//open resources like File, Database connection, Sockets etc
} catch (FileNotFoundException e) {
// Exception handling like FileNotFoundException, IOException etc
}finally{
// close resources
}
Java 7 попробуйте с реализацией ресурсов :
try(// open resources here){
// use resources
} catch (FileNotFoundException e) {
// exception handling
}
// resources are closed as soon as try-catch block is executed.
Давайте напишем простую программу для чтения файла и распечатаем первую строку, используя Java 6 или более старые версии и Java 7 попробуйте с ресурсами реализация.
Пример управления ресурсами Java 6
package com.journaldev.util;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Java6ResourceManagement {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("C:\\journaldev.txt"));
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
Java 7 Попробуйте С Примером Ресурсов
package com.journaldev.util;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Java7ResourceManagement {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader(
"C:\\journaldev.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Попробуйте Java с преимуществами ресурсов
Некоторые из преимуществ использования try с ресурсами на java заключаются в следующем;
- Более читаемый код и его легко писать.
- Автоматическое управление ресурсами.
- Количество строк кода уменьшается.
- Нет необходимости в окончательной блокировке только для того, чтобы закрыть ресурсы.
- Мы можем открыть несколько ресурсов в инструкции try-with-resources, разделенной точкой с запятой. Например, мы можем написать следующий код:
- Когда в try-with-resources открывается несколько ресурсов, он закрывает их в обратном порядке, чтобы избежать каких-либо проблем с зависимостями. Вы можете расширить мою программу ресурсов, чтобы доказать это.
Java 7 представила новый интерфейс java.lang.Автоклавируемый . Чтобы использовать любой ресурс в try-with-resources, он должен реализовать автоклавируемый интерфейс, иначе компилятор java выдаст ошибку компиляции.
Давайте подтвердим это примером:
package com.journaldev.util;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.FileSystems;
public class Java7ResourceManagement {
public static void main(String[] args) {
try (MyResource mr = new MyResource()) {
System.out.println("MyResource created in try-with-resources");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Out of try-catch block.");
}
static class MyResource implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("Closing MyResource");
}
}
}
Результатом приведенной выше программы является:
MyResource created in try-with-resources Closing MyResource Out of try-catch block.
Из выходных данных ясно, что, как только блок try-catch завершен, вызывается метод закрытия ресурса.
Попробуйте с исключениями ресурсов
Следует отметить одно различие между попыткой поймать, наконец, и попыткой с ресурсами в случае исключений .
Если исключение создается как в блоке try, так и в блоке finally, метод возвращает исключение, созданное в блоке finally.
Для try-с-ресурсами, если исключение создается в блоке try и в инструкции try-с-ресурсами, метод возвращает исключение, созданное в блоке try.
Чтобы лучше прояснить это различие, мы рассмотрим пример кода.
package com.journaldev.util;
public class Java7ResourceManagement {
public static void main(String[] args) throws Exception {
try {
tryWithResourceException();
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
normalTryException();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static void normalTryException() throws Exception {
MyResource mr = null;
try {
mr = new MyResource();
System.out.println("MyResource created in the try block");
if (true)
throw new Exception("Exception in try");
} finally {
if (mr != null)
mr.close();
}
}
private static void tryWithResourceException() throws Exception {
try (MyResource mr = new MyResource()) {
System.out.println("MyResource created in try-with-resources");
if (true)
throw new Exception("Exception in try");
}
}
static class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Closing MyResource");
throw new Exception("Exception in Closing");
}
}
}
Результатом приведенной выше программы является:
MyResource created in try-with-resources Closing MyResource Exception in try MyResource created in the try block Closing MyResource Exception in Closing
Вывод программы доказывает приведенную выше разницу. Это все для Java 7, попробуйте с ресурсами.