Java proporciona una característica para hacer que el código sea más robusto y reducir las líneas de código. Esta función se conoce como Gestión automática de recursos (ARM) mediante el uso de recursos de prueba desde Java 7 en adelante. La sentencia try-with-resources es una sentencia try que declara uno o más recursos.
Esta declaración garantiza que cada recurso se cierre al final de la declaración, lo que facilita el trabajo con recursos externos que deben eliminarse o cerrarse en caso de errores o finalización exitosa de un bloque de código.
El recurso es un objeto que debe cerrarse después de que el programa termine de usarlo. Cualquier objeto que implemente java.lang.AutoCloseable , que incluye todos los objetos que implementen java.io.Closeable, se puede usar como recurso.
Un viejo método de limpieza de recursos – Usando finalmente
En versiones anteriores de Java anteriores a JDK 1.7, el cierre de recursos se realizaba mediante el bloque finalmente.
Java
// Java program to illustrate cleaning of // resources before Java 7 import java.io.*; import java.util.*; import java.io.*; class Resource { public static void main(String args[]) { BufferedReader br = null; String str = " "; System.out.println("Enter the file path"); br = new BufferedReader(new InputStreamReader(System.in)); try { str = br.readLine(); } catch(IOException e) { e.printStackTrace(); } try { String s; // file resource br = new BufferedReader(new FileReader(str)); while ((s = br.readLine()) != null) { // print all the lines in the text file System.out.println(s); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) // closing the resource in 'finally' block br.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
Producción:
hello java
La nueva forma: usar probar con recursos
El método anterior que usa try-catch-finally es innecesariamente complicado con bloques de prueba anidados. Esto se puede simplificar utilizando el método de prueba con recursos al contener todas las declaraciones en los bloques de prueba anidados del código anterior en un solo bloque de prueba.
En el método de prueba con recursos, no se utiliza el bloque finalmente. El recurso de archivo se abre en el bloque de prueba dentro de pequeños corchetes. Solo los objetos de esas clases se pueden abrir dentro del bloque que implementa la interfaz AutoCloseable, y esos objetos también deben ser locales. El recurso se cerrará automáticamente independientemente de si la declaración de prueba se completa de manera normal o abrupta.
Sintaxis:
El siguiente ejemplo lee la primera línea de un archivo. Utiliza una instancia de BufferedReader para leer datos del archivo. BufferedReader es un recurso que debe cerrarse después de que el programa termine con él:
static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
Ejemplo
Java
// Java program to illustrate // Automatic Resource Management // in Java without finally block import java.io.*; import java.util.*; class Resource { public static void main(String args[]) { String str = ""; BufferedReader br = null; System.out.println("Enter the file path"); br = new BufferedReader( new InputStreamReader(System.in)); try { str = br.readLine(); } catch (IOException e) { e.printStackTrace(); } // try with Resource // note the syntax difference try (BufferedReader b = new BufferedReader(new FileReader(str))) { String s; while ((s = b.readLine()) != null) { System.out.println(s); } } catch (IOException e) { e.printStackTrace(); } } }
Producción:
hello java
Gestión automática de recursos en múltiples recursos
Se pueden usar múltiples recursos dentro de un bloque de prueba con recursos y hacer que todos se cierren automáticamente. En este caso, los recursos se cerrarán en el orden inverso al que fueron creados dentro de los corchetes.
Java
// Java program to illustrate // Automatic Resource Management // in Java with multiple resource class Resource { public static void main(String s[]) { // note the order of opening the resources try (Demo d = new Demo(); Demo1 d1 = new Demo1()) { int x = 10 / 0; d.show(); d1.show1(); } catch (ArithmeticException e) { System.out.println(e); } } } // custom resource 1 class Demo implements AutoCloseable { void show() { System.out.println("inside show"); } public void close() { System.out.println("close from demo"); } } // custom resource 2 class Demo1 implements AutoCloseable { void show1() { System.out.println("inside show1"); } public void close() { System.out.println("close from demo1"); } }
Producción:
close from demo1 close from demo
Nota: En el ejemplo anterior, Demo y Demo1 son los recursos personalizados administrados dentro del bloque de prueba. Dichos recursos deben implementar la interfaz AutoCloseable. Cuando abrimos cualquier recurso AutoCloseable de este tipo en el bloque especial de prueba con recurso, inmediatamente después de finalizar el bloque de prueba, JVM llama al método this.close() en todos los recursos inicializados en el bloque de prueba.
Puntos importantes:
- Los bloques finalmente se usaron para limpiar los recursos antes de Java 7.
- Después de Java 7, la limpieza de recursos se realiza automáticamente.
- ARM se realiza cuando inicializa los recursos en el bloque de prueba con recursos debido a la interfaz AutoCloseable. JVM invoca su método de cierre tan pronto como finaliza el bloque de prueba.
- Llamar al método close() podría generar resultados inesperados.
- Un recurso que usamos en try-with-resource debe ser un subtipo de AutoCloseable para evitar un error de tiempo de compilación.
- Los recursos que se utilizan en ARM de recursos múltiples deben cerrarse en orden inverso como se indica en el ejemplo anterior.
Este artículo es una contribución de Apoorva Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA