A classe Scanner do Java faz parte do pacote java.util. Ela foi introduzida na versão 1.5 do Java. O Scanner é usado principalmente para receber a entrada do usuário e convertê-la em tipos primitivos de dados, como int, double ou String padrão. É uma classe utilitária para analisar dados usando expressões regulares, gerando tokens.
Construtores da Classe Scanner do Java
Se você olhar 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.
- File ou Path – podemos escanear dados de um arquivo e trabalhar com os valores do arquivo.
- String – também podemos criar um scanner para uma fonte de string e analisar valores dela.
Se você olhar o segundo argumento, ele serve para especificar um conjunto de caracteres caso você não queira usar o conjunto de caracteres padrão para 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) – define o delimitador a ser usado pelo scanner. O delimitador padrão é o espaço em branco.
- hasNext() – retorna verdadeiro 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, portanto, uma vez concluído, use este método para fechá-lo e liberar os recursos do sistema.
Existem muitos métodos utilitários 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.
- Por fim, feche a instância do Scanner para liberar os recursos do sistema.
Exemplos do Scanner
Vamos dar uma olhada em 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 instanciá-la com System.in como fonte de entrada e ler a entrada do usuário.
// ler a 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();
Saída:
Please enter your name
Pankaj
Hello Pankaj
Bem, parece fácil e está funcionando 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 eu escrevo meu nome completo na entrada.
Please enter your name
Pankaj Kumar
Hello Pankaj
Agora você deve ter entendido, isso 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 “Olá Pankaj” é impresso.
Como podemos corrigir 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. Vamos supor 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 delimitador como nova linha para ler uma linha como um único token
- // criar a lista de Funcionários
// fechar o scanner
// imprimir registros de funcionários
// criar scanner para o registro String
// definir 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();
Então, para cada linha que contém registro de funcionário no formato CSV, analisamos usando outro scanner e vírgula como delimitador. A função parseEmployeeData() está analisando cada linha e criando um objeto 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