Librería scanner en java para principiantes y expertos

20/12/2002

La clase Scanner en Java, perteneciente al paquete java.util, es una herramienta fundamental para la entrada y procesamiento de datos. Introducida en Java 5, facilita la lectura de datos desde diversas fuentes, como la consola, archivos o cadenas de texto, convirtiéndolos en tipos de datos primitivos como int, doubleo String. Su capacidad para analizar datos mediante expresiones regulares la convierte en una herramienta versátil y potente.

Temario

Constructores de la clase Scanner

La clase Scannerofrece diversos constructores, la mayoría de los cuales utilizan uno de estos tres objetos como fuente de datos:

  • InputStream : El más común, generalmente usando System.in para recibir entrada del usuario.
  • File o Path : Permite escanear datos desde archivos.
  • String : Permite crear un Scanner para analizar valores de una cadena de texto.

Algunos constructores también aceptan un segundo argumento para especificar un conjunto de caracteres si se necesita uno diferente al conjunto de caracteres predeterminado.

Métodos comunes de la clase Scanner

Entre los métodos más utilizados destacan:

  • useDelimiter(String pattern) : Establece el delimitador para el Scanner . Por defecto, el delimitador es el espacio en blanco.
  • hasNext() : Devuelve true si hay otro token en la entrada. Es un método bloqueante que espera la entrada del usuario.
  • next() : Devuelve el siguiente token del Scanner . Se utiliza junto con hasNext() .
  • close() : Cierra el Scanner liberando los recursos del sistema. Es crucial para evitar fugas de recursos.

Existen otros métodos auxiliares para verificar y analizar directamente el token de entrada en int, short, long, byte, BigDecimal, etc.

Flujo de trabajo con Scanner

El proceso típico de uso de Scannerimplica estos pasos:

  1. Inicialización: Crear una instancia de Scanner usando el constructor adecuado según la fuente de datos ( InputStream , File o String ). Se puede establecer el delimitador y el conjunto de caracteres si es necesario.
  2. Búsqueda de tokens: Utilizar el método hasNext() para comprobar si hay más tokens disponibles.
  3. Lectura de tokens: Utilizar el método next() para leer el siguiente token y procesarlo.
  4. Cierre del Scanner: Utilizar el método close() para liberar los recursos del sistema una vez finalizado el proceso.

El Scannerdivide la entrada en tokens utilizando el patrón de delimitador especificado. Los métodos next()se encargan de leer y procesar los tokens uno por uno.

Ejemplos de uso de Scanner

Lectura de entrada del usuario

Este es el ejemplo más básico:

Scanner sc = new Scanner(System.in);System.out.println("Please enter your name");String name = sc.next();System.out.println("Hello " + name);sc.close();

Problema: Este código tiene un problema. Si el usuario ingresa un nombre completo (con espacios), solo se leerá la primera palabra debido al delimitador por defecto (espacio en blanco).

Solución: Cambiar el delimitador a un carácter de nueva línea usando useDelimiter():

Scanner sc = new Scanner(System.in);sc.useDelimiter(System.getProperty("line.separator"));System.out.println("Please enter your name");String name = sc.next();System.out.println("Hello " + name);sc.close();

Lectura de archivos CSV

Supongamos un archivo employees.csvcon el siguiente contenido:

1,Jane Doe,CEO2,Mary Ann,CTO3,John Lee,CFO

El siguiente código lee el archivo y crea una lista de objetos Employee:

// ... (código para la clase Employee) ...Scanner sc = new Scanner(new File("employees.csv"));sc.useDelimiter(System.getProperty("line.separator"));List<Employee> emps = new ArrayList<>();while (sc.hasNext()) { Employee emp = parseEmployeeData(sc.next()); emps.add(emp);}sc.close();System.out.println(emps);// ... (código para parseEmployeeData) ...

Procesamiento de una cadena con expresiones regulares

Si tenemos una cadena con números y otros caracteres, podemos usar expresiones regulares para extraer solo los números:

String data = "1a2b345c67d8,9#10";Scanner sc1 = new Scanner(data);scuseDelimiter("\D");while (schasNext()) { System.out.println(scnext());}scclose();

Consideraciones adicionales

Aunque Scanneres útil para tareas simples, para aplicaciones que manejan grandes volúmenes de datos o formatos complejos como CSV, es recomendable utilizar librerías especializadas como Apache Commons CSV o OpenCSV, que ofrecen mejor rendimiento y manejo de errores.

Consultas habituales sobre la librería Scanner Java

A continuación, se responden algunas de las preguntas más frecuentes sobre el uso de la librería Scanneren Java:

¿Cómo leer un entero con Scanner?

Se utiliza el método nextInt():

Scanner scanner = new Scanner(System.in);System.out.print("Introduce un entero: ");int numero = scanner.nextInt();System.out.println("El número introducido es: " + numero);scanner.close();

¿Cómo leer un double con Scanner?

Se utiliza el método nextDouble():

Scanner scanner = new Scanner(System.in);System.out.print("Introduce un número decimal: ");double numeroDecimal = scanner.nextDouble();System.out.println("El número decimal introducido es: " + numeroDecimal);scanner.close();

¿Cómo leer una línea completa de texto con Scanner?

Se utiliza el método nextLine():

Scanner scanner = new Scanner(System.in);System.out.print("Introduce una línea de texto: ");String lineaTexto = scanner.nextLine();System.out.println("La línea de texto introducida es: " + lineaTexto);scanner.close();

¿Cómo manejar excepciones con Scanner?

Es crucial manejar las excepciones InputMismatchExceptionque pueden ocurrir si el usuario ingresa un dato de un tipo diferente al esperado. Se recomienda usar bloques try-catch:

Scanner scanner = new Scanner(System.in);try { System.out.print("Introduce un entero: "); int numero = scanner.nextInt(); System.out.println("El número introducido es: " + numero);} catch (InputMismatchException e) { System.out.println("Error: Entrada inválida. Introduce un entero.");} finally { scanner.close();}

Tabla comparativa de métodos Scanner

Método Descripción
next() Lee el siguiente token.
nextInt() Lee el siguiente entero.
nextDouble() Lee el siguiente double.
nextFloat() Lee el siguiente float.
nextLine() Lee la línea completa.
hasNext() Comprueba si hay un siguiente token.
hasNextInt() Comprueba si hay un siguiente entero.
hasNextDouble() Comprueba si hay un siguiente double.
useDelimiter() Cambia el delimitador.
close() Cierra el Scanner.

La correcta utilización de la clase Scanner en Java es esencial para el desarrollo de aplicaciones robustas y eficientes, capaces de interactuar con el usuario y procesar datos de diversas fuentes. Recuerda siempre cerrar el Scannerutilizando el método close()para liberar los recursos del sistema.

Si quieres conocer otros artículos parecidos a Librería scanner en java para principiantes y expertos puedes visitar la categoría Libros y Librerías.

Subir