Classe Scanner em Java

A classe Scanner do Java faz parte do pacote java.util. Foi introduzida na versão 1.5 do Java. O Scanner é principalmente usado para receber a entrada do usuário e analisá-la em tipos de dados primitivos, como int, double ou String padrão. É uma classe de utilidade para analisar dados usando expressões regulares, gerando tokens.

Construtores da Classe Scanner do Java

Se olharmos para a classe Scanner, existem muitos construtores.

Scanner Class Constructors

A maioria dos construtores utiliza um dos três objetos:

  1. InputStream – o mais comum, onde passamos System.in para receber a entrada do usuário.
  2. Arquivo ou Caminho – Podemos escanear dados de arquivo também e trabalhar com os valores do arquivo.
  3. String – Podemos criar um scanner para uma origem de string também e analisar valores dela.

Se olharmos para o segundo argumento, é para especificar um conjunto de caracteres se você não quiser usar o conjunto de caracteres padrão para a análise.

Métodos Importantes da Classe Scanner

Vamos dar uma olhada em alguns dos métodos mais comumente usados da classe Scanner.

  • useDelimiter(String pattern) – o delimitador a ser usado para o scanner. O delimitador padrão é espaço em branco.
  • hasNext() – retorna true se houver outro token na entrada. É um método de bloqueio e continuará aguardando a entrada do usuário.
  • next() – retorna o próximo token do scanner. É usado em conjunto com o método hasNext().
  • close() – o scanner consome muitos recursos, então, quando terminar de usá-lo, use este método para fechá-lo e liberar os recursos do sistema.

Existem muitos métodos de utilidade para verificar e analisar diretamente o token de entrada em int, short, long, byte, BigDecimal, etc.

Passos para Inicializar e Usar o Scanner

  1. O primeiro passo é inicializar a classe do scanner usando o construtor apropriado com base no tipo de entrada, como InputStream, File ou String. Se necessário, defina o delimitador e o conjunto de caracteres a serem usados.
  2. O segundo passo é aguardar o token de entrada usando o método hasNext().
  3. Em seguida, use o método next() para ler o token e processá-los um por um.

Como o Scanner Funciona?

  • A classe Scanner quebra sua entrada em tokens usando o padrão de delimitador especificado.
  • O método next() é usado para ler os tokens um por um e processá-los.
  • Finalmente, feche a instância do Scanner para liberar os recursos do sistema.

Exemplos do Scanner

Vamos ver alguns dos usos comuns da classe Scanner com trechos de código de exemplo.

1. Lendo a entrada do usuário

Este é o uso mais comum da classe Scanner. Podemos instanciar com System.in como fonte de entrada e ler a entrada do usuário.

// ler entrada do usuário
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();

Resultado:

Please enter your name
Pankaj
Hello Pankaj

Bem, parece fácil e funciona bem. Mas, o código acima tem um problema. Sem ler a próxima seção, você pode verificar o código e tentar identificá-lo?

Vamos ver o que acontece quando escrevo meu nome completo na entrada.

Please enter your name
Pankaj Kumar
Hello Pankaj

Agora você deve ter entendido, está acontecendo porque o espaço em branco é o delimitador. O scanner está dividindo a entrada em dois tokens – Pankaj e Kumar. Mas, estamos chamando o método next() apenas uma vez, então apenas “Hello Pankaj” é impresso.

Como corrigimos isso?

É simples. Podemos alterar o delimitador para um caractere de nova linha usando o 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. Analisando Dados de Arquivo usando Scanner

Vamos dar uma olhada em um exemplo simples para ler e analisar arquivos CSV usando a classe Scanner. Digamos que tenho um arquivo employees.csv com o seguinte conteúdo.

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

Vamos ler o arquivo e obter uma lista de Funcionários em nosso 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 + "]";
	}
}
  • // criar scanner para o arquivo CSV
  • // definir o delimitador como nova linha para ler uma linha como um único token
  • // criar a Lista de Funcionários

// fechar o scanner

// imprimir registros dos funcionários

// criar scanner para o registro de String

// definir o delimitador como vírgula
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);

// fechar o scanner
sc1.useDelimiter("\\D");

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

O primeiro passo é criar o scanner para o arquivo CSV e definir a nova linha como delimitador.
sc1.close();

Em seguida, para cada linha que contém registro de funcionário no formato CSV, analisá-la usando outro scanner e vírgula como delimitador. O método parseEmployeeData() está analisando cada linha e criando um objeto de Funcionário.

1
2
345
67
8
9
10

Finalmente, estamos adicionando o objeto de funcionário à lista e imprimindo-o.

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

3. Exemplo de Expressão Regular do Scanner Java

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