Cerrar un archivo en Java

Rupam Yadav 15 febrero 2024
  1. Cerrar un archivo utilizando try-with-resources en Java (7+)
  2. Utilizar el método close() para cerrar un archivo en Java
  3. Conclusión
Cerrar un archivo en Java

Manipular archivos es una tarea fundamental en la programación en Java, y la gestión adecuada de los recursos es esencial. En el pasado, cerrar archivos requería intervención manual mediante bloques finally o el método close(), lo cual podía propiciar errores y provocar fugas de recursos.

Sin embargo, con la introducción de la estructura try-with-resources en Java 7 y el uso continuado del método close(), la gestión de archivos se ha vuelto más eficiente y menos propensa a errores.

En este artículo, exploraremos cómo cerrar archivos de manera efectiva en Java utilizando tanto try-with-resources como el método close(). Discutiremos la sintaxis, proporcionaremos ejemplos prácticos para cada método y destacaremos la importancia de la gestión de recursos al trabajar con archivos.

Cerrar un archivo utilizando try-with-resources en Java (7+)

Antes de Java 7, los desarrolladores tenían que cerrar archivos manualmente utilizando bloques finally, lo cual podía propiciar errores y provocar fugas de recursos. Sin embargo, con la introducción de try-with-resources en Java 7, la manipulación de archivos se volvió más eficiente y menos propensa a errores.

try-with-resources es una característica del lenguaje introducida en Java 7 que simplifica la gestión de recursos. Gestiona automáticamente el cierre de recursos, como archivos, al final del bloque try, ya sea que el bloque se salga de manera normal o debido a una excepción. La sintaxis para utilizar try-with-resources con archivos es sencilla:

try (ResourceType resource = new ResourceType()) {
  // Use the resource here
} catch (Exception e) {
  // Handle exceptions if necessary
}
// Resource is automatically closed when exiting this block

Así es cómo se utiliza try-with-resources para cerrar archivos:

  1. Inicialización de recursos: En los paréntesis que siguen a la palabra clave try, se declara e inicializa el recurso (en este caso, una clase relacionada con archivos, como FileInputStream, FileOutputStream, BufferedReader o BufferedWriter). El recurso debe implementar la interfaz AutoCloseable o sus subinterfaces, como Closeable.
  2. Uso del recurso: Dentro del bloque try, se utiliza el recurso según sea necesario para leer, escribir u otras operaciones. No es necesario cerrar explícitamente el recurso en tu código.
  3. Cierre del recurso: Una vez que la ejecución sale del bloque try, ya sea por finalización normal o por una excepción, el recurso se cierra automáticamente. No es necesario escribir un bloque finally para asegurar el cierre.

Ejemplo práctico

Veamos cómo funciona try-with-resources con un ejemplo práctico de lectura de datos desde un archivo:

import java.io.FileInputStream;
import java.io.IOException;

public class FileReadExample {
  public static void main(String[] args) {
    try (FileInputStream fis = new FileInputStream("example.txt")) {
      int data;
      while ((data = fis.read()) != -1) {
        System.out.print((char) data);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    // The FileInputStream is automatically closed
  }
}

En este ejemplo, abrimos un archivo usando FileInputStream dentro del bloque try y leemos su contenido. Una vez que el bloque se sale, ya sea por finalización normal o por una excepción, el FileInputStream se cierra automáticamente, liberando recursos del sistema.

Manejo de excepciones

try-with-resources también simplifica el manejo de excepciones. Si ocurre una excepción dentro del bloque try, el recurso se cierra automáticamente antes de que la excepción se propague hacia arriba en la pila de llamadas. Puedes capturar y manejar excepciones en el bloque catch según sea necesario.

import java.io.FileOutputStream;
import java.io.IOException;

public class FileWriteExample {
  public static void main(String[] args) {
    try (FileOutputStream fos = new FileOutputStream("output.txt")) {
      // Write data to the file
      fos.write("Hello, World!".getBytes());
    } catch (IOException e) {
      e.printStackTrace();
    }
    // The FileOutputStream is automatically closed
  }
}

Utilizar el método close() para cerrar un archivo en Java

La clase BufferedWriter se utiliza en el siguiente programa. Esta clase permite escribir de manera eficiente arreglos, cadenas y caracteres en una secuencia de salida de caracteres.

También utilizamos la clase FileWriter, diseñada para escribir secuencias de caracteres, y la clase BufferedWriter.

Una ruta de archivo está representada por una instancia de la clase File. Se construye una ruta de acceso abstracta a partir de una cadena de ruta de acceso especificada.

El método write() de BufferedWriter guarda texto en el archivo. El método newLine() agrega un /n como separador de línea.

La mayoría de los flujos no necesitan ser cerrados después de su uso. Cuando la fuente es un canal de entrada/salida, se recomienda cerrar el flujo.

Deberíamos invocar el método close() antes de terminar el programa o ejecutar cualquier operación de archivo. Podríamos perder algunos datos si no lo hacemos.

Como resultado, para cerrar el flujo y mantener los datos seguros, se utiliza el método close().

Los flujos incluyen un método llamado BaseStream.close(), que implementa Autoclosable. Casi todas las instancias de flujo no necesitan cerrarse porque son compatibles con colecciones, que son matrices que no necesitan ninguna gestión adicional de recursos.

El flujo debe cerrarse si la fuente es un canal de E/S.

A continuación se muestra el contenido del archivo antes de realizar la operación de escritura.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CloseFile {
  public static void main(String[] args) throws Exception {
    File file = new File("/Users/John/Temp/demo1.txt");
    if (file.exists()) {
      BufferedWriter bufferWriter = new BufferedWriter(new FileWriter(file, true));
      bufferWriter.write("New Text");
      bufferWriter.newLine();
      bufferWriter.close();
    }
  }
}

Contenido del Archivo Antes de la Operación de Escritura

Después de realizar la operación de escritura, el contenido del archivo cambió.

Realizar Operación de Escritura

Conclusión

En este artículo, hemos demostrado cómo utilizar tanto try-with-resources como el método close() para cerrar archivos, tanto para operaciones de lectura como de escritura, y cómo cada enfoque simplifica el manejo de excepciones.

Estos métodos se consideran prácticas recomendadas en la programación moderna de Java para cerrar archivos y otros recursos, asegurando una gestión eficiente y confiable de los recursos.

Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

Artículo relacionado - Java File