Logo

dev-resources.site

for different kinds of informations.

Try with resources en Java

Published at
12/16/2024
Categories
java
spanish
programming
beginners
Author
asjordi
Author
7 person written this
asjordi
open
Try with resources en Java

Al trabajar con recursos en Java, como archivos, conexiones a bases de datos, sockets, etc., es importante cerrarlos correctamente una vez que ya no se necesitan, de lo contrario se pueden producir algunos problemas como fugas de memoria o bloqueos de recursos.

En Java, la forma tradicional de cerrar recursos es utilizando bloques try-catch-finally, donde dentro del bloque finally se cierran los recursos, siempre y cuando estos tengan un método close(), para más información sobre este bloque puedes consultar el siguiente post.

El bloque try-with-resources es una alternativa al bloque try-catch-finally cuando se trabaja con recursos que se pueden cerrar automáticamente, siendo necesario que estos implementen la interfaz AutoCloseable o Closeable, siendo esta la única condición para que un determinado recurso pueda ser utilizado en este bloque. Considerando que los recursos se cerrarán automáticamente sin importar si se lanzan excepciones o no en el flujo de ejecución.

La sintaxis del bloque try-with-resources es la siguiente:

try (ResourceType resource = new ResourceType()) {
    // Código que utiliza el recurso
} catch (Exception e) {
    // Manejo de excepciones
}
Enter fullscreen mode Exit fullscreen mode

Para ejemplificar el uso del bloque try-with-resources, consideremos que tenemos un método readFile que recibe como parámetro el nombre de un archivo y retorna un String con el contenido del archivo, en primera instancia este solo utiliza un bloque try-catch para leer el archivo y cerrar los recursos manualmente.

public static String readFile(String name) {
    StringBuilder sb = new StringBuilder();
    File file = new File(name);

    try {
        Reader r = new FileReader(file);
        BufferedReader br = new BufferedReader(r);
        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line).append("\n");
        }

        r.close();
        br.close();
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
        throw new RuntimeException(e);
    } catch (IOException e) {
        System.out.println(e.getMessage());
        throw new RuntimeException(e);
    }

    return sb.toString();
}
Enter fullscreen mode Exit fullscreen mode

Ahora implementemos este método utilizando el bloque try-catch-finally:

public static String readFile(String name) throws IOException {
    StringBuilder sb = new StringBuilder();
    File file = new File(name);

    Reader r = null;
    BufferedReader br = null;

    try {
        r = new FileReader(file);
        br = new BufferedReader(r);
        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line).append("\n");
        }
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
        throw new RuntimeException(e);
    } catch (IOException e) {
        System.out.println(e.getMessage());
        throw new RuntimeException(e);
    } finally {
        r.close();
        br.close();
    }

    return sb.toString();
}
Enter fullscreen mode Exit fullscreen mode

Considerando este método podemos ver lo siguiente:

  • Los recursos Reader y BufferedReader se inicializan fuera del bloque try, para que puedan ser cerrados en el bloque finally.
  • En caso de que cualquiera de los recursos sea null, se lanzará una excepción al intentar cerrarlo, por lo que se deben anidar bloques try-catch adicionales para manejar estas excepciones.
  • Se pueden propagar las excepciones lanzadas al cerrar los recursos en la firma del método, lo que puede no ser deseable.

Al utilizar el bloque try-with-resources, el código anterior se simplifica y se vuelve más legible, ya que los recursos se cierran automáticamente y no es necesario anidar bloques try-catch adicionales.

public static String readFile(String name) {
    StringBuilder sb = new StringBuilder();
    File file = new File(name);

    try (Reader r = new FileReader(file);
         BufferedReader br = new BufferedReader(r)) {
        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line).append("\n");
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
        throw new RuntimeException(e);
    }

    return sb.toString();
}
Enter fullscreen mode Exit fullscreen mode

Los recursos Reader y BufferedReader se declaran e inicializan dentro del bloque try, en caso de solo ser un recurso no es necesario colocar ; al final de la declaración, en caso contrario se deben separar por ; tal y como se muestra en el ejemplo. Es importante recordar que cada recurso debe implementar la interfaz AutoCloseable o Closeable para poder ser utilizado en este bloque.

Ahora podemos ejecutar el método e imprimir por consola el contenido del archivo:

var output = readFile("file.txt");
System.out.println(output);

// Output:
Hello world!
Enter fullscreen mode Exit fullscreen mode

Listo, de esta manera nos aseguramos de que todos los recursos utilizados se cierren automáticamente, sin la necesidad de llamar al método close() explícitamente. En caso de que se utilice un bloque try-catch-finally para cerrar los recursos el propio IDE nos sugerirá reemplazarlo por un bloque try-with-resources si es posible.

spanish Article's
30 articles in total
Favicon
Cómo gestionar tus proyectos de software con Github
Favicon
Más Allá del Código: La Importancia de la Resolución de Problemas para Destacar como Programador
Favicon
Configurar servidor de archivos local con Ubuntu y Samba
Favicon
Envias Correo Electrónicos gratis con Resend Emails
Favicon
Git avanzado: ¿Qué es cherry pick? 🍒
Favicon
Desplegar un contenedor de Docker desde Azure Container Registry en una WebApp
Favicon
Cómo puedes llegar a ser AWS Cloud Club Captain (consejos de una capitana!)
Favicon
¿Elegimos el lenguaje de programación o el destino lo elige por nosotros?
Favicon
Proyecto Lombok en Java
Favicon
Crear software: Juego de personas
Favicon
"Escapando" de IntelliJ
Favicon
Las claves para NO romperlo TODO: Branches en Git 🚨🔑
Favicon
Git: haz que todos amen leer tus commits
Favicon
¿Qué son los enums en Java?
Favicon
Puede la IA reemplazar los trabajos de desarrollo? Vamos a hablar de ello!
Favicon
¿Para qué sirve String[] args en el método main de Java?
Favicon
La dualidad de tu profesión.
Favicon
Cómo instalar el JDK de Java usando Temurin en Windows
Favicon
Aprende a programar con Python y Thonny 🐍
Favicon
¡Primeros pasos en GIT! GIT para PRINCIPIANTES
Favicon
¿Qué es GIT, por qué TODOS los developers lo usan?: Historia de GIT
Favicon
Try with resources en Java
Favicon
Redes neuronales convolucionales (CNN) y redes neuronales recurrentes (RNN)
Favicon
JSON Web Tokens (JWT): Guía Esencial y Buenas Prácticas
Favicon
Cómo instalar el OpenJDK de Java en Windows
Favicon
Cómo Desarrollé MemoMate: Un Asistente Personal en Telegram con IA
Favicon
Cómo ver los campos de tu WordPress de un modo diferente
Favicon
Construyendo un Sistema de Asistencia con Reconocimiento Facial Usando Next.js y FACEIOm
Favicon
JSON#: nuestro propio lector/escritor
Favicon
Recursos para AWS Certified Cloud Practitioner

Featured ones: