Автор оригинала: 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, попробуйте с ресурсами.