Clase Scanner en Java

La clase Scanner de Java es parte del paquete java.util. Se introdujo en la versión Java 1.5. El Scanner se utiliza principalmente para recibir la entrada del usuario y analizarla en tipos de datos primitivos como int, double o String predeterminado. Es una clase de utilidad para analizar datos utilizando expresiones regulares mediante la generación de tokens.

Constructores de la Clase Scanner de Java

Si observas la clase Scanner, hay muchos constructores.

Scanner Class Constructors

La mayoría de los constructores utilizan uno de los tres objetos:

  1. InputStream – el más común donde pasamos System.in para recibir la entrada del usuario.
  2. Archivo o Ruta – También podemos escanear datos de archivo y trabajar con los valores del archivo.
  3. String – También podemos crear un escáner para una fuente de cadena y analizar valores de ella.

Si observas el segundo argumento, es para especificar un conjunto de caracteres si no quieres usar el conjunto de caracteres predeterminado para el análisis.

Métodos Importantes de la Clase Scanner

Veamos algunos de los métodos más comúnmente utilizados de la clase Scanner.

  • useDelimiter(String pattern) – el delimitador que se utilizará para el escáner. El delimitador predeterminado es el espacio en blanco.
  • hasNext() – devuelve true si hay otro token en la entrada. Es un método de bloqueo y seguirá esperando la entrada del usuario.
  • next() – devuelve el próximo token del escáner. Se utiliza en conjunto con el método hasNext().
  • close() – el escáner consume muchos recursos, así que una vez que haya terminado con él, use este método para cerrarlo y liberar los recursos del sistema.

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

Pasos para Inicializar y Usar el Escáner

  1. El primer paso es inicializar la clase del escáner mediante el uso del constructor adecuado según el tipo de entrada, como InputStream, File o String. Si es necesario, establezca el delimitador y el conjunto de caracteres a utilizar.
  2. El segundo paso es esperar el token de entrada utilizando el método hasNext().
  3. Luego, use el método next() para leer el token y procesarlos uno por uno.

¿Cómo Funciona el Escáner?

  • La clase Scanner divide su entrada en tokens utilizando el patrón de delimitador especificado.
  • El método next() se utiliza para leer los tokens uno por uno y procesarlos.
  • Finalmente, cierre la instancia de Scanner para liberar los recursos del sistema.

Ejemplos de Scanner

Veamos algunos de los usos comunes de la clase Scanner con ejemplos de código.

1. Lectura de entrada de usuario

Este es el uso más común de la clase Scanner. Podemos instanciarlo con System.in como fuente de entrada y leer la entrada del usuario.

// leer la entrada del usuario
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();

Salida:

Please enter your name
Pankaj
Hello Pankaj

Bueno, parece fácil y funciona bien. Pero, el código anterior tiene un problema. Sin leer la siguiente sección, ¿puedes revisar el código e intentar identificarlo?

Vamos a ver qué sucede cuando escribo mi nombre completo en la entrada.

Please enter your name
Pankaj Kumar
Hello Pankaj

Ahora debes haberlo entendido, esto sucede porque el delimitador es el espacio en blanco. El escáner está dividiendo la entrada en dos tokens – Pankaj y Kumar. Pero, estamos llamando al método next() solo una vez, así que solo se imprime “Hola Pankaj”.

¿Cómo lo solucionamos?

Es simple. Podemos cambiar el delimitador a un carácter de nueva línea usando el método 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();

2. Analizando Datos del Archivo usando Scanner

Vamos a ver un ejemplo sencillo para leer y analizar archivos CSV utilizando la clase Scanner. Supongamos que tengo un archivo employees.csv con el siguiente contenido.

1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO

Vamos a leer el archivo y obtener una lista de empleados en nuestro programa Java.

package com.journaldev.java;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ScannerExamples {

	public static void main(String[] args) throws IOException {

		// create scanner for the CSV file
		Scanner sc = new Scanner(new File("employees.csv"));

		// set delimiter as new line to read one line as a single token
		sc.useDelimiter(System.getProperty("line.separator"));

		// create the List of Employees
		List<Employee> emps = new ArrayList<>();

		while (sc.hasNext()) {
			Employee emp = parseEmployeeData(sc.next());
			emps.add(emp);
		}

		// close the scanner
		sc.close();

		// print employee records
		System.out.println(emps);
	}

	private static Employee parseEmployeeData(String record) {
		// create scanner for the String record
		Scanner sc = new Scanner(record);

		// set delimiter as comma
		sc.useDelimiter(",");

		Employee emp = new Employee();
		emp.setId(sc.nextInt());
		emp.setName(sc.next());
		emp.setRole(sc.next());

		// close the scanner
		sc.close();

		return emp;
	}

}

class Employee {
	private int id;
	private String name;
	private String role;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "Emp[" + id + "," + name + "," + role + "]";
	}
}
  • // crear un scanner para el archivo CSV
  • // establecer el delimitador como nueva línea para leer una línea como un único token
  • // crear la lista de empleados

// cerrar el scanner

// imprimir registros de empleados

// crear un scanner para el registro de cadena

// establecer el delimitador como coma
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);

// cerrar el scanner
sc1.useDelimiter("\\D");

while(sc1.hasNext()) {
	System.out.println(sc1.next());
}

El primer paso es crear el scanner para el archivo CSV y establecer la nueva línea como delimitador.
sc1.close();

Luego, para cada línea que contiene un registro de empleado en formato CSV, analícelo utilizando otro scanner y coma como delimitador. La función parseEmployeeData() analiza cada línea y crea un objeto Employee.

1
2
345
67
8
9
10

Finalmente, agregamos el objeto de empleado a la lista e imprimimos.

Salida: [Emp[1, Jane Doe, CEO], Emp[2, Mary Ann, CTO], Emp[3, John Lee, CFO]]

3. Ejemplo de Expresión Regular con Java Scanner

Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java