L’outil Scanner

En Java, la classe Scanner permet à un utilisateur d’écrire du texte et au programme de lire ce texte.

Création et utilisation de l’outil Scanner

L’outil Scanner peut être importé dans un programme Java grâce à la commande import java.util.Scanner. L’outil Scanner lui-même est créé avec Scanner scanner = new Scanner(System.in).

import java.util.Scanner;
public class Programme {
 
	public static void main(String[] args) {
	
		Scanner scanner = new Scanner(System.in);
		
		// Affiche "Ecrire un nombre: "
		System.out.print("Ecrire un nombre: ");
		
		//Lit l'entier écrit par l'utilisateur et l'affecte
		// à la variable nombre du programme
		int nombre = scanner.nextInt();
		
		// Affiche le nombre saisit par l'utilisateur
		System.out.println(nombre);
		
		scanner.close();
	}

Les différentes méthodes de lecture de l’outil scanner

L’outil Scanner détient plusieurs méthodes qui permettent de lire les entrées de l’utilisateur.

TypeMéthodesDescription
Stringnext()Renvoie le prochain token complet de l’analyseur
bytenextByte()Renvoie un byte lu au clavier
doublenextDouble()**Renvoie un double lu au clavier
floatnextFloat()Renvoie un float lu au clavier
intnextInt()Renvoie un int lu au clavier
longnextLong()Renvoie un long lu au clavier
shortnextShort()Renvoie un short lu au clavier
booleannextBoolean()Renvoie un boolean lu au clavier
StringnextLine()Renvoie une chaîne de caractère lu au clavier
booleanhasNext()Retourne « vrai » si le scanner a une autre donnée dans son entrée
booleanhasNextInt()Vérifie si la prochaine donnée dans l’entrée peut être interprétée comme un int en utilisant la méthode nextInt() ou non
booleanhasNextFloat()Vérifie si la prochaine donnée dans l’entrée de ce scanner peut être interprétée comme un float en utilisant la méthode nextFloat() ou non
booleanhasNextLine()Vérifie s’il y a une autre ligne dans l’entrée de ce scanner ou non

Info

scanner.nextInt()

Cette methode lit uniquement l’entier, mais laisse le retour à la ligne dans le buffer.

Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt(); // Lit "42" mais laisse le "\n" dans le buffer
String nom = scanner.nextLine(); // capture le "\n" restant -> nom = ""

Integer.parseInt(scanner.nextLine()) Cette méthode lit toute la ligne y compris le retour à la ligne, puis convertit la chaîne en entier

Scanner scanner = new Scanner(System.in);
int age = Integer.parseInt(scanner.nextLine()); // consomme le "\n"
String nom = scanner.nextLine(); // fonctionne normalement

Contrôle des données saisies par l’utilisateur

Il est possible avec la classe Scanner de préciser le format des données à saisir et que l’utilisateur doit respecter.

  • Pour les nombres on peut faire une exception de type “NumberFormatException”.
int age = 0;
try {
age = Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.println("Veuillez entrer un chiffre.")}
  • On peut aussi utiliser la fonction hasNext() pour une vérification préalable
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("Veuillez saisir un nombre");
if (scanner.hasNextInt()) {
	int nombre = scanner.nextInt;
	System.out.print("Nombre valide : " + nombre);
} else {
	System.out.print("Entrée invalide");
	scanner.next(); // Consomme l'entrée invalide
}
scanner.close();
  • Pour les Expressions régulières (Regex) on peut faire une exception de type “InputMismatchException”
import java.util.InputMismatchException;
import java.util.Scanner;
public class Programme {
	public static void main(String[] args){
		try{ Scanner sc = new Scanner(System.in);
			System.out.print("Veuillez saisir votre mail: ");
			String email = sc.next( "[\\w.-]+@[\\w.-]+\\.[a-z]{2,}" );
			System.out.println(email + " : Email valide !");
		} catch(InputMismatchException e){
			System.out.println("Email non valide");
		}
scanner.close();
	}
}
  • On peut aussi utiliser la fonction matches() pour les chaines de caractères
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
String email;
 
System.out.print("Entrez votre Email :");
email = scanner.nextLine();
 
String regexEmail = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-za-z]{2,}$";
 
if (email.matches(regexEmail)) {
	System.out.print("Email valide");
} else {
	System.out.print("Email invalide");
scanner.close();
}