La classe Scanner di Java fa parte del pacchetto java.util. È stata introdotta nella versione Java 1.5. Lo Scanner viene principalmente utilizzato per ricevere input dall’utente e analizzarlo in tipi di dati primitivi come int, double o stringa predefinita. È una classe di utilità per il parsing dei dati utilizzando espressioni regolari mediante la generazione di token.
Costruttori della classe Scanner di Java
Se si guarda alla classe Scanner, ci sono molti costruttori.

La maggior parte dei costruttori utilizza uno dei tre oggetti:
- InputStream – il più comune, dove passiamo System.in per ricevere input dall’utente.
- File o Path – Possiamo analizzare anche i dati di un file e lavorare con i valori del file.
- String – Possiamo creare uno scanner per una stringa e analizzare i valori da essa.
Se si guarda al secondo argomento, serve a specificare un set di caratteri se non si vuole utilizzare il set di caratteri predefinito per il parsing.
Metodi importanti della classe Scanner
Analizziamo alcuni dei metodi più comunemente utilizzati della classe Scanner.
- useDelimiter(String pattern) – il delimitatore da utilizzare per lo scanner. Il delimitatore predefinito è lo spazio vuoto.
- hasNext() – restituisce true se c’è un altro token nell’input. È un metodo bloccante e continuerà ad aspettare l’input dell’utente.
- next() – restituisce il prossimo token dallo scanner. Viene utilizzato in concomitanza con il metodo hasNext().
- close() – lo scanner è pesante in termini di risorse, quindi una volta che hai finito con esso, usa questo metodo per chiuderlo e rilasciare le risorse di sistema.
Esistono molti metodi di utilità per verificare e analizzare direttamente il token di input in int, short, long, byte, BigDecimal, ecc.
Passaggi per Inizializzare e Usare lo Scanner
- Il primo passo è inizializzare la classe dello scanner utilizzando il costruttore appropriato in base al tipo di input, come InputStream, File o String. Se necessario, impostare il delimitatore e il set di caratteri da utilizzare.
- Il secondo passo è aspettare il token di input utilizzando il metodo hasNext().
- Quindi usa il metodo next() per leggere il token e elaborarli uno per uno.
Come Funziona lo Scanner?
- La classe Scanner suddivide il suo input in token utilizzando il modello di delimitazione specificato.
- Il metodo next() viene utilizzato per leggere i token uno per uno e elaborarli.
- Infine, chiudi l’istanza di Scanner per rilasciare le risorse di sistema.
Esempi di Scanner
Diamo un’occhiata a alcune delle utilizzazioni comuni della classe Scanner con frammenti di codice di esempio.
1. Lettura dell’input dell’utente
Questa è l’uso più comune della classe Scanner. Possiamo istanziarla con System.in come sorgente di input e leggere l’input dell’utente.
// leggi l'input dell'utente
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
Output:
Please enter your name
Pankaj
Hello Pankaj
Bene, sembra facile e funziona bene. Ma il codice sopra ha un problema. Senza leggere la sezione successiva, puoi verificare il codice e cercare di identificarlo?
Vediamo cosa succede quando scrivo il mio nome completo nell’input.
Please enter your name
Pankaj Kumar
Hello Pankaj
Ora dovresti averlo capito, sta accadendo perché lo spazio bianco è il delimitatore. Lo scanner sta suddividendo l’input in due token – Pankaj e Kumar. Ma stiamo chiamando il metodo next() solo una volta, quindi viene stampato solo “Ciao Pankaj”.
Come possiamo risolvere questo problema?
È semplice. Possiamo cambiare il delimitatore con un carattere di nuova riga usando il metodo 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. Analisi dei dati del file utilizzando Scanner
Diamo un’occhiata a un esempio semplice per leggere e analizzare file CSV utilizzando la classe scanner. Diciamo che ho un file employees.csv con il seguente contenuto.
1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO
Leggiamo il file e otteniamo una lista di dipendenti nel nostro programma 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 + "]";
}
}
- // crea uno scanner per il file CSV
- // imposta il delimitatore come nuova riga per leggere una riga come un unico token
- // crea la lista dei dipendenti
// chiudi lo scanner
// stampa i record dei dipendenti
// crea uno scanner per il record di tipo stringa
// imposta il delimitatore come virgola
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);
// chiudi lo scanner
sc1.useDelimiter("\\D");
while(sc1.hasNext()) {
System.out.println(sc1.next());
}
Il primo passo è creare lo scanner per il file CSV e impostare la nuova riga come delimitatore.
sc1.close();
Quindi, per ogni riga che contiene un record di dipendente in formato CSV, analizzalo utilizzando un altro scanner e la virgola come delimitatore. Il parseEmployeeData() sta analizzando ogni riga e creando un oggetto Employee.
1
2
345
67
8
9
10
Infine, stiamo aggiungendo l’oggetto dipendente alla lista e stampandolo.
Output: [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