Leer datos del teclado en Java: IO.readln y Scanner

Para leer del teclado en Java hubo durante años que crear un Scanner o un BufferedReader. Java 25 añadió la clase IO, con IO.readln: pedir un dato es una línea. Aquí están las dos formas, y cómo convertir lo que escriben a número sin que el programa se caiga.

Con IO.readln (Java 25)

void main() {
    String nombre = IO.readln("¿Cómo te llamas? ");
    int edad = Integer.parseInt(IO.readln("¿Cuántos años tienes? ").strip());
    IO.println("Hola, " + nombre + ". En diez años tendrás " + (edad + 10) + ".");
}
salida (la entrada fue «Ana» y «31»; lo tecleado no se repite aquí)¿Cómo te llamas? ¿Cuántos años tienes? Hola, Ana. En diez años tendrás 41.

IO.readln(mensaje) muestra el mensaje y espera a que el usuario escriba una línea y pulse Enter. Siempre devuelve texto; para un número hay que convertirlo con Integer.parseInt o Double.parseDouble.

Que un dato mal escrito no tire el programa

int pedirEntero(String mensaje) {
    while (true) {
        String texto = IO.readln(mensaje);
        if (texto == null) throw new IllegalStateException("se acabó la entrada");
        try {
            return Integer.parseInt(texto.strip());
        } catch (NumberFormatException e) {
            IO.println("«" + texto + "» no es un número entero. Intenta otra vez.");
        }
    }
}

void main() {
    int piezas = pedirEntero("¿Cuántas piezas? ");
    IO.println("Pediste " + piezas + " piezas.");
}
salida (el usuario escribió «doce» y luego «12»)¿Cuántas piezas? «doce» no es un número entero. Intenta otra vez.
¿Cuántas piezas? Pediste 12 piezas.

parseInt lanza NumberFormatException si el texto no es un número, y el bucle vuelve a preguntar. readln devuelve null si la entrada se acaba (por ejemplo, al pulsar Ctrl+D), y hay que contemplarlo para no entrar en un bucle infinito.

Con Scanner: varios datos en una línea

import java.util.Scanner;

void main() {
    var entrada = new Scanner(System.in);
    int n = entrada.nextInt();
    long suma = 0;
    for (int i = 0; i < n; i++) suma += entrada.nextInt();
    IO.println("La suma de los " + n + " números es " + suma);
}
salida (la entrada fue «3» y «10 20 30»)La suma de los 3 números es 60

Scanner parte la entrada en palabras y convierte cada una con nextInt, nextDouble o next, sin importar si vienen en la misma línea o en varias. Es lo práctico para problemas de programación competitiva y para leer archivos de números. La trampa clásica: después de nextInt(), un nextLine() devuelve el resto vacío de la línea anterior; no mezcles los dos estilos, o lee siempre con nextLine() y convierte tú.

Todo el código se compiló y se ejecutó con Java 25 LTS en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.