Introducción al Scanner de Java

Cuando empezamos a programar en Java, una de las herramientas más útiles para interactuar con el usuario o procesar datos es la clase Scanner. Esta clase nos permite leer datos de distintas fuentes, como cadenas de texto, archivos o incluso el teclado, y procesarlos de forma sencilla y ordenada.

Para entender bien qué hace Scanner, primero debemos comprender qué significa escanear en este contexto. Imaginemos que tenemos una cadena de caracteres que contiene números separados por espacios, como 123 456 789 012. Si queremos extraer cada número por separado, lo que hacemos es recorrer la cadena poco a poco, identificando cada componente que está delimitado por un espacio. Esto es precisamente lo que hace Scanner: automatiza ese proceso para que no tengamos que hacerlo manualmente.

Además, Scanner no solo funciona con números, sino que también puede leer palabras o cualquier otro tipo de dato que esté en la fuente que le proporcionemos. Por ejemplo, si tenemos la cadena hola mundo como estamos, Scanner puede devolvernos cada palabra una a una, facilitando la lectura secuencial de la información.

Para usar Scanner con una cadena de texto, podemos crear un objeto Scanner pasando el string como parámetro. Luego, con métodos como next(), podemos obtener la siguiente palabra o token que esté delimitado por espacios o saltos de línea. Por ejemplo, si llamamos a next() cuatro veces sobre la cadena Hola Mundo Como Estamos, obtendremos cada una de esas palabras en orden.

Es importante tener en cuenta que si intentamos leer más allá del final de la cadena, Java lanzará una excepción NoSuchElementException. Para evitar esto, podemos usar el método hasNext(), que nos indica si todavía quedan datos por leer. Así, podemos controlar la lectura dentro de un bucle y detenernos cuando no haya más elementos.

Scanner también nos ofrece métodos especializados para leer distintos tipos de datos. Por ejemplo, nextInt() para enteros, nextBoolean() para booleanos, nextDouble() para números decimales, entre otros. Estos métodos intentan convertir el siguiente token en el tipo de dato solicitado. Si el token no es compatible, se lanzará una excepción InputMismatchException. Para prevenir errores, podemos usar métodos como hasNextInt() que verifican si el siguiente token puede ser leído como un entero antes de intentar leerlo.

Cuando trabajamos con números en una cadena, Scanner puede leerlos fácilmente si están separados por espacios. Por ejemplo, con la cadena 1 2 3 4 5, nextInt() nos devolverá cada número en orden. Esto nos permite, por ejemplo, sumar todos los números que recibimos en una cadena de texto.

Sin embargo, si los datos están separados por otro tipo de delimitadores, como guiones o comas, Scanner no podrá leerlos correctamente con la configuración por defecto, ya que espera espacios o saltos de línea como separadores. Para solucionar esto, podemos usar el método useDelimiter() y especificar el carácter o patrón que queremos usar como separador. Por ejemplo, si tenemos la cadena 91-14-66-33-22-11, podemos indicarle a Scanner que el guion es el delimitador para que pueda leer cada número correctamente.

Además de trabajar con cadenas, Scanner puede leer datos directamente desde el teclado usando System.in como fuente. Esto es muy útil para crear programas interactivos donde el usuario introduce datos por consola. Al crear un Scanner con System.in, el programa quedará a la espera de que el usuario escriba algo y presione Enter. Luego, podemos leer ese dato con los métodos que hemos visto, como nextInt() o next().

Para manejar la entrada del usuario de forma segura, es recomendable usar los métodos hasNextInt() o similares para validar que el dato introducido es del tipo esperado antes de leerlo. De esta forma, evitamos que el programa falle si el usuario introduce un valor incorrecto.

Un ejemplo sencillo para leer números desde el teclado y sumarlos podría ser el siguiente:

import java.util.Scanner;

public class SumaNumeros {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int total = 0;

        System.out.println("Introduce números para sumar. Escribe una letra para terminar.");

        while (scan.hasNextInt()) {
            int num = scan.nextInt();
            total += num;
            System.out.println("He leído: " + num);
        }

        System.out.println("La suma total es: " + total);
        scan.close();
    }
}

En este código, el programa lee números mientras el usuario los introduzca y los suma. Cuando el usuario introduce un valor que no es un número, el bucle termina y se muestra la suma total.

En definitiva, la clase Scanner es una herramienta muy versátil para leer y procesar datos de forma estructurada en Java. Nos permite manejar entradas desde diferentes fuentes, validar tipos de datos y personalizar cómo se separan los elementos que queremos leer. Esto facilita mucho la interacción con el usuario y el procesamiento de información en nuestros programas.

Lista de reproducción
  1. 1
    ¿Cómo funciona Comparator en Java?
    10 minutos
  2. 2
    ¿Para qué sirve Override?
    4 minutos
  3. 3
    Cómo usar la clase Properties en Java
    14 minutos
  4. 4
    Interfaces funcionales y funciones flecha
    8 minutos
  5. 5
    Bloque static de Java: inicializadores estáticos y otros usos
    7 minutos
  6. 6
    import static, ¿para qué sirve?
    3 minutos
  7. 7
    Uso de Optional en Java
    10 minutos
  8. 8
    Introducción al Scanner de Java
    11 minutos
  9. 9
    ¿Para qué sirve el modificador static de Java?
    6 minutos
  10. 10
    Funciones variádicas en Java
    6 minutos
  11. 11
    Inner classes en Java
    8 minutos
  12. 12
    var en Java: una introducción para gente nueva
    7 minutos
  13. 13
    Switch expressions en Java
    10 minutos
  14. 14
    Java: del instanceof al Pattern Matching
    7 minutos
  15. 15
    Sealed classes en Java
    8 minutos
  16. 16
    Getters y setters o atributos públicos en Java, ¿qué es mejor?
    9 minutos
  17. 17
    El String[] args del método main de Java
    8 minutos
  18. 18
    Introducción a clases anónimas en Java
    6 minutos
  19. 19
    Introducción a enum en Java
    6 minutos