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.

A maioria dos construtores utiliza um dos três objetos:
- InputStream – o mais comum, onde passamos System.in para receber a entrada do usuário.
- Arquivo ou Caminho – Podemos escanear dados de arquivo também e trabalhar com os valores do arquivo.
- 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
- 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.
- O segundo passo é aguardar o token de entrada usando o método hasNext().
- 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]]
Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java