Entrada y salida estándar
Scanner, System.out y BufferedReader
System.out y formateo
System.out es un PrintStream que escribe en la salida estándar.
println añade salto de línea; print no. printf permite formateo al estilo
C. Usa %n (no \n) para saltos de línea multiplataforma.
// System.out: PrintStream conectado a la salida estándar
System.out.println("Con salto de línea");
System.out.print("Sin salto de línea");
System.out.printf("Formateado: %s tiene %d años%n", nombre, edad);
// System.err: salida de error estándar (normalmente en rojo en la terminal)
System.err.println("Error: fichero no encontrado");
// String.format: formateo sin imprimir (útil para construir mensajes)
String msg = String.format("Usuario %s (id=%d)", nombre, id);
// Especificadores de formato más comunes:
// %s → String %d → entero decimal
// %f → float/double %n → salto de línea (multiplataforma)
// %b → boolean %x → hexadecimal
// %.2f → dos decimales %10s → ancho mínimo 10 Scanner: lectura de consola
Scanner es la forma más sencilla de leer entrada del usuario. El punto conflictivo más común es combinar
nextInt()/nextDouble()
con nextLine(): los primeros no consumen el salto de línea final, por lo que el siguiente nextLine() devuelve una cadena vacía si no se consume primero.
import java.util.Scanner;
// Scanner sobre System.in: lectura de la consola
Scanner sc = new Scanner(System.in);
System.out.print("Nombre: ");
String nombre = sc.nextLine(); // lee toda la línea
System.out.print("Edad: ");
int edad = sc.nextInt(); // lee un entero
sc.nextLine(); // consumir el salto de línea pendiente tras nextInt
System.out.print("Precio: ");
double precio = sc.nextDouble(); // lee un double (cuidado con locale: coma vs punto)
sc.nextLine();
System.out.println("Hola " + nombre + ", " + edad + " años, precio " + precio);
sc.close(); // cerrar el Scanner al terminar Scanner sobre ficheros y strings
// Scanner también puede leer ficheros o strings
import java.io.File;
// Leer desde fichero
Scanner sc = new Scanner(new File("datos.txt"));
while (sc.hasNextLine()) {
String linea = sc.nextLine();
System.out.println(linea);
}
sc.close();
// Leer desde String (útil para tests o parseo)
Scanner parser = new Scanner("42 3.14 hola");
int num = parser.nextInt();
double dec = parser.nextDouble();
String txt = parser.next(); BufferedReader: lectura eficiente
Para procesar archivos grandes BufferedReader es significativamente más rápido que Scanner porque acumula la lectura en un buffer interno. La contrapartida es que no tiene métodos de parseo convenientes
— hay que convertir las líneas manualmente con Integer.parseInt() etc.
// BufferedReader: más eficiente que Scanner para leer grandes cantidades de texto
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// try-with-resources garantiza el cierre del reader
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
String linea;
while ((linea = br.readLine()) != null) {
System.out.println("Leído: " + linea);
}
} catch (IOException e) {
System.err.println("Error de lectura: " + e.getMessage());
}
// BufferedReader es ~10x más rápido que Scanner para archivos grandes
// pero no tiene métodos convenientes como nextInt() — hay que parsear manualmente