La classe Scanner, definita nel package java.util, rappresenta un scanner di testo capace di riconoscere i tipi primitivi e le stringhe, utilizzando le espressioni regolari.
La stringa viene divisa in token utilizzando un separatore che, solitamente, è lo spazio.
I token possono essere converiti in differenti tipi utilizzando i metodi next (ad esempio, nextInt, nextDouble).
Per testare, invece, la presenza di ulteriori token, possiamo utilizzare i metodi hasNext.

Vediamo il più semplice utilizzo della classe:

import java.util.Scanner;

public class Main
{
	public static void main(String[] argv)
	{
		String input = "1 2 antonio 3.14";
		Scanner scanner = new Scanner(input);

		while(scanner.hasNext())
		{
			// output: 1 2 antonio 3.14
			System.out.println(scanner.next());
		}

		scanner.close();
	}
}

Come si nota, sono stati estratti tutti i token dallo scanner.
Di seguito, invece, si convertono i token in interi:

import java.util.Scanner;

public class Main
{
	public static void main(String[] argv)
	{
		String input = "15 21";
		Scanner scanner = new Scanner(input);
		int i = scanner.nextInt();
		int j = scanner.nextInt();
		System.out.println(i + j); // output: 36
		scanner.close();
	}
}

Se vogliamo estrarre solo gli interi, possiamo saltare i restanti token:

import java.util.Scanner;
import java.util.Vector;

public class Main
{
	public static void main(String[] argv)
	{
		String input = "jjj 1 xyz 56 78 .,- pp 1092 yasl 3.14 100";
		Scanner scanner = new Scanner(input);
		Vector<Integer> vi = new Vector<Integer>();

		while(scanner.hasNext())
		{

			// se il prossimo è un intero lo estraggo
			// e lo aggiungo al vector
			if(scanner.hasNextInt())
				vi.add(scanner.nextInt());
			// altrimenti lo salto
			else
				scanner.next();
		}

		for(Integer i : vi)
			System.out.println(i);		

		scanner.close();
	}
}

Come abbiamo potuto notare da questi esempi, il delimitatore era lo spazio bianco. Se vogliamo utilizzare un delimitatore diverso, possiamo utilizzare il metodo useDelimiter, il quale accetta una stringa indicante un’espressione regolare o un java.util.regex.Pattern:

import java.util.Scanner;

public class Main
{
	public static void main(String[] argv)
	{
		String input = "marco, antonio,   giovanni  , \t  aldo";
		Scanner scanner = new Scanner(input);
		scanner.useDelimiter("\\s*,\\s*");

		while(scanner.hasNext())
		{
			//output: marco antonio giovanni aldo
			System.out.print(scanner.next() + " ");
		}

		scanner.close();
	}
}

in questo esempio, abbiamo specificato una regular expression che rappresenta 0 o più spazi bianchi, seguiti da una virgola, seguita da 0 o più spazi bianchi (si noti come anche il carattere di tabulazione sia stato saltato).

Tra i costruttori di classe, è presente anche un’overload che consente di fornire, come sorgente, un InputStream. Possiamo dunque utilizzarlo per fornire un’input da console:

import java.util.Scanner;
import java.util.InputMismatchException;

public class Main
{
	public static void main(String[] argv)
	{
		int i;
		int j;
		Scanner scanner = new Scanner(System.in);		

		try {
			System.out.print("Primo numero: ");
			i = scanner.nextInt();
			System.out.print("Secondo numero: ");
			j = scanner.nextInt();

			System.out.println(i + j);
		}
		catch(InputMismatchException ex)
		{
			System.out.println(ex);
		}
		finally
		{
			scanner.close();
		}
	}
}

In questo esempio, passiamo da console due numeri (il flusso del programma si fermerà in attesa dell’input in corrispondenza delle due nextInt) e ne effettuiamo la somma. Il tutto va in un blocco try-catch dato che l’input passato potrebbe non essere un intero.

Un’altro costruttore presente permette di passare un java.io.File:

import java.util.Scanner;
import java.util.InputMismatchException;
import java.io.File;
import java.io.FileNotFoundException;

public class Main
{
	public static void main(String[] argv)
	{
		Scanner scanner = null;

		try
		{
			scanner = new Scanner(new File("Main.java"));
			scanner.useDelimiter("\n");
			while(scanner.hasNext())
				System.out.println(scanner.next());
		}
		catch(FileNotFoundException ex)
		{
			System.out.println(ex);
		}
		finally
		{
			if(scanner != null)
				scanner.close();
		}
	}
}

Supponendo che il file in cui risiede il codice si chiami proprio Main.java, questo esempio stampa in console l’intero file, con la stessa formattazione, dato che si utilizza come delimitatore il carattere di newline.