Cierre seguro de streams
try-with-resources
Cierre seguro de streams es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Por qué cerrar los flujos
Los flujos como BufferedReader conservan recursos del sistema —identificadores de archivo, búferes de memoria y conexiones. Si nunca los cierra, esos recursos pueden quedar filtrados.
Cerrar un flujo libera lo que mantiene y vacía cualquier dato pendiente. En esta lección se muestra cómo hacerlo de forma segura.
El método close
Todo lector tiene un método close(). Al llamarlo, se libera el recurso.
En un BufferedReader que envuelve System.in, el cierre también cierra los flujos subyacentes que envuelve.
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();La forma antigua y arriesgada
Podría llamar manualmente a close(), pero si se produce un error antes de que se ejecute esa línea, close() se omite y el recurso queda filtrado.
Colocar close() en un bloque finally ayuda, pero resulta verboso y es fácil equivocarse.
BufferedReader br = null;
try {
br = new BufferedReader(
new InputStreamReader(System.in));
// ... use br ...
} finally {
if (br != null) br.close();
}try-with-resources
Java ofrece una solución más limpia: try-with-resources. Se declara el flujo entre paréntesis después de try, y Java lo cierra automáticamente cuando termina el bloque —incluso si se produce un error.
Sin finally ni llamadas manuales a close(). Esta es la práctica recomendada moderna.
try (BufferedReader br =
new BufferedReader(new InputStreamReader(System.in))) {
String line = br.readLine();
System.out.println(line);
}Cómo funciona
Cualquier recurso declarado entre los paréntesis de try (...) debe implementar AutoCloseable. BufferedReader lo hace, por lo que Java llama a su método close() por usted.
El cierre se produce después de que termina el bloque, tanto si finaliza normalmente como si lo hace debido a una excepción.
Un ejemplo completo
Este es un programa completo que utiliza try-with-resources para leer una línea. El lector se cierra automáticamente al final del bloque.
Lee de System.in, por lo que espera una entrada y no se puede ejecutar automáticamente aquí.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))) {
String name = br.readLine();
System.out.println("Hi " + name);
}
}
}Ejecutable con StringReader
Para demostrar que try-with-resources funciona sin entrada del teclado, aquí se lee desde un StringReader. Se puede ejecutar por completo.
Después del bloque, el lector se cierra automáticamente —no debe escribir ninguna llamada a close().
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br =
new BufferedReader(new StringReader("done"))) {
System.out.println(br.readLine());
}
}
}Varios recursos
Puede declarar varios recursos en un mismo try, separados por punto y coma. Java los cierra todos en el orden inverso al de su declaración.
Esto resulta práctico cuando se combinan varios flujos.
try (InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr)) {
System.out.println(br.readLine());
}Captura de IOException
La lectura puede lanzar IOException. Puede añadir un catch a un bloque try-with-resources para gestionarla en lugar de declarar throws.
El recurso se sigue cerrando automáticamente antes de que se ejecute catch.
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))) {
System.out.println(br.readLine());
} catch (IOException e) {
System.out.println("Read failed");
}¿Debe cerrar System.in?
Una advertencia: cerrar un lector de System.in también cierra el propio System.in, y no puede volver a abrirlo.
En programas cortos, esto no supone ningún problema. Sin embargo, si más adelante aún necesita leer de la consola, no cierre ese lector concreto. Tenga claro qué envuelve su flujo.
Buenas prácticas
Para gestionar los flujos de forma segura:
- Prefiera try-with-resources a
close()manual. - El recurso se cierra automáticamente incluso cuando se producen errores.
- Recuerde que cerrar un lector de
System.incierra la entrada estándar.
Una gestión adecuada de los recursos evita filtraciones y errores.
Comprobación rápida
Piense en la principal ventaja de try-with-resources.
Repaso
Ha aprendido por qué deben cerrarse los flujos, cuáles son los riesgos del enfoque manual con finally y cuál es el patrón limpio try-with-resources, que cierra automáticamente los recursos AutoCloseable.
Ahora puede leer la entrada de forma segura con BufferedReader, de principio a fin.
Preguntas frecuentes
¿La lección «Cierre seguro de streams» es gratis?
Sí — el texto completo de «Cierre seguro de streams» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Cierre seguro de streams»?
try-with-resources Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Cierre seguro de streams»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué BufferedReader
- Lectura de líneas
- Análisis de números de la entrada
- Cierre seguro de streams