La función readLine en Java es un método de la clase BufferedReader que se utiliza
para leer texto línea por línea desde una fuente de entrada, como un archivo, la entrada
estándar (teclado), o un flujo de datos (InputStream). Es especialmente útil para leer
datos estructurados o no estructurados que están separados por saltos de línea.
1. Conceptos básicos
Sintaxis del método
java
Copiar código
public String readLine() throws IOException
• Retorno: Devuelve una línea de texto como una cadena (String). Si el final de la
fuente de entrada se alcanza, devuelve null.
• Excepción: Puede lanzar una IOException si ocurre algún error de entrada/salida.
Ejemplo básico: Leer líneas desde un archivo
java
Copiar código
import [Link].*;
public class LeerLineas {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new
FileReader("[Link]"))) {
String linea;
while ((linea = [Link]()) != null) { // Leer línea
por línea
[Link](linea);
}
} catch (IOException e) {
[Link]();
}
}
}
Explicación:
1. BufferedReader se usa para mejorar la eficiencia de lectura.
2. readLine() lee una línea completa hasta encontrar un salto de línea (\n) o el final
del archivo.
2. Leer desde la entrada estándar
Ejemplo: Leer desde el teclado
java
Copiar código
import [Link].*;
public class LeerTeclado {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new
InputStreamReader([Link]))) {
[Link]("Escribe una línea (o 'salir' para
terminar):");
String linea;
while (!(linea = [Link]()).equalsIgnoreCase("salir"))
{
[Link]("Leído: " + linea);
}
} catch (IOException e) {
[Link]();
}
}
}
Explicación:
• InputStreamReader convierte los bytes de la entrada estándar ([Link]) en
caracteres.
• BufferedReader optimiza la lectura.
• El programa sigue leyendo hasta que el usuario ingrese "salir".
3. Leer un archivo completo en una sola operación
Aunque readLine() se utiliza normalmente en un bucle, también puedes leer todas las
líneas de un archivo utilizando un enfoque acumulativo.
Ejemplo: Leer todo el archivo
java
Copiar código
import [Link].*;
import [Link];
import [Link];
public class LeerTodoArchivo {
public static void main(String[] args) {
List<String> lineas = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new
FileReader("[Link]"))) {
String linea;
while ((linea = [Link]()) != null) {
[Link](linea); // Agregar línea a la lista
}
} catch (IOException e) {
[Link]();
}
// Imprimir todo el contenido
[Link]([Link]::println);
}
}
4. Procesar archivos con delimitadores personalizados
Aunque readLine() solo detecta saltos de línea, puedes usarlo junto con métodos como
split para dividir líneas en base a delimitadores.
Ejemplo: Leer un archivo CSV
java
Copiar código
import [Link].*;
public class LeerCSV {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new
FileReader("[Link]"))) {
String linea;
while ((linea = [Link]()) != null) {
String[] columnas = [Link](","); // Divide la
línea por comas
for (String columna : columnas) {
[Link](columna + " | ");
}
[Link]();
}
} catch (IOException e) {
[Link]();
}
}
}
5. Leer archivos grandes eficientemente
Si trabajas con archivos muy grandes, readLine() es ideal porque permite procesar una
línea a la vez sin cargar todo el archivo en memoria.
Ejemplo: Contar líneas no vacías
java
Copiar código
import [Link].*;
public class ContarLineas {
public static void main(String[] args) {
int contador = 0;
try (BufferedReader br = new BufferedReader(new
FileReader("[Link]"))) {
String linea;
while ((linea = [Link]()) != null) {
if (![Link]().isEmpty()) { // Ignorar líneas
vacías
contador++;
}
}
} catch (IOException e) {
[Link]();
}
[Link]("Número total de líneas no vacías: " +
contador);
}
}
6. Uso avanzado: Procesar con Streams en Java 8+
readLine() se puede combinar con Streams para aprovechar el procesamiento
funcional.
Ejemplo: Procesar líneas con filtros
java
Copiar código
import [Link].*;
import [Link];
public class ProcesarConStream {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new
FileReader("[Link]"))) {
Stream<String> lineas = [Link](); // Convierte a Stream
long lineasValidas = lineas
.filter(linea ->
![Link]().isEmpty()) // Filtrar líneas vacías
.count();
[Link]("Número de líneas válidas: " +
lineasValidas);
} catch (IOException e) {
[Link]();
}
}
}
Errores comunes al usar readLine()
1. Archivo no encontrado:
o Asegúrate de que el archivo existe y que la ruta es correcta.
o Usa rutas absolutas o asegúrate de que el archivo esté en el directorio de
ejecución.
2. Excepciones sin manejar:
o readLine() lanza IOException, por lo que es necesario manejarla con un
bloque try-catch.
3. No cerrar recursos:
o Siempre cierra los recursos utilizando try-with-resources.
4. Entradas vacías o nulas:
o Asegúrate de verificar si readLine() devuelve null para evitar errores.
7. Combinación con otros patrones de lectura
Puedes usar readLine() en conjunto con otras técnicas para realizar tareas más
avanzadas, como analizar logs o datos en tiempo real.
Ejemplo avanzado: Leer un archivo de configuración
java
Copiar código
import [Link].*;
import [Link];
import [Link];
public class LeerConfiguracion {
public static void main(String[] args) {
Map<String, String> configuracion = new HashMap<>();
try (BufferedReader br = new BufferedReader(new
FileReader("[Link]"))) {
String linea;
while ((linea = [Link]()) != null) {
if ([Link]().isEmpty() || [Link]("#")) {
continue; // Ignorar líneas vacías o comentarios
}
String[] partes = [Link]("=", 2); // Dividir
clave y valor
[Link](partes[0].trim(), partes[1].trim());
}
} catch (IOException e) {
[Link]();
}
// Mostrar configuración cargada
[Link]((clave, valor) ->
[Link](clave + ": " + valor));
}
}
Resumen
El método readLine() es versátil y puede utilizarse en casos simples (lectura básica) y
complejos (procesamiento de archivos grandes, integración con Streams, y más). Su uso
depende del contexto y las necesidades del programa.