Cerrar un archivo en Java
-
Cerrar un archivo utilizando
try-with-resources
en Java (7+) -
Utilizar el método
close()
para cerrar un archivo en Java - Conclusión
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:
- 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, comoFileInputStream
,FileOutputStream
,BufferedReader
oBufferedWriter
). El recurso debe implementar la interfazAutoCloseable
o sus subinterfaces, comoCloseable
. - 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. - 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 bloquefinally
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();
}
}
}
Después de realizar la operación de escritura, el contenido del archivo cambió.
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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn