Classe Scanner en Java

La classe Scanner de Java fait partie du package java.util. Elle a été introduite dans la version Java 1.5. Le Scanner est principalement utilisé pour recevoir les entrées de l’utilisateur et les analyser en types de données primitifs tels que int, double ou String par défaut. C’est une classe utilitaire pour analyser les données à l’aide d’expressions régulières en générant des jetons.

Constructeurs de la classe Java Scanner

Si vous regardez la classe Scanner, vous verrez de nombreux constructeurs.

Scanner Class Constructors

La plupart des constructeurs utilisent l’un des trois objets suivants :

  1. InputStream – le plus courant, où nous utilisons System.in pour recevoir les entrées de l’utilisateur.
  2. Fichier ou chemin – Nous pouvons également analyser des données de fichier et travailler avec les valeurs du fichier.
  3. Chaîne – Nous pouvons également créer un scanner pour une source de chaîne et analyser des valeurs à partir de celle-ci.

Si vous regardez le deuxième argument, il sert à spécifier un jeu de caractères si vous ne voulez pas utiliser le jeu de caractères par défaut pour l’analyse.

Méthodes importantes de la classe Scanner

Jetons un coup d’œil à certaines des méthodes les plus couramment utilisées de la classe Scanner.

  • useDelimiter(String pattern) – le délimiteur à utiliser pour le scanner. Le délimiteur par défaut est l’espace.
  • hasNext() – retourne vrai s’il y a un autre jeton dans l’entrée. C’est une méthode bloquante et elle continuera d’attendre une entrée utilisateur.
  • next() – retourne le prochain jeton du scanner. Il est utilisé en conjonction avec la méthode hasNext().
  • close() – le scanner consomme beaucoup de ressources, donc une fois que vous avez fini avec, utilisez cette méthode pour le fermer et libérer les ressources système.

Il existe de nombreuses méthodes utilitaires pour vérifier et analyser directement le jeton d’entrée en int, short, long, byte, BigDecimal, etc.

Étapes pour initialiser et utiliser le Scanner

  1. La première étape consiste à initialiser la classe Scanner en utilisant le constructeur approprié en fonction du type d’entrée tel que InputStream, File ou String. Si nécessaire, définissez le délimiteur et l’ensemble de caractères à utiliser.
  2. La deuxième étape consiste à attendre le jeton d’entrée en utilisant la méthode hasNext().
  3. Ensuite, utilisez la méthode next() pour lire le jeton et les traiter un par un.

Comment fonctionne le Scanner?

  • La classe Scanner divise son entrée en jetons en utilisant le modèle de délimiteur spécifié.
  • Les méthodes next() sont utilisées pour lire les jetons un par un et les traiter.

Exemples de Scanner

Enfin, fermez l’instance du Scanner pour libérer les ressources système.

1. Lecture de l’entrée utilisateur

C’est l’utilisation la plus courante de la classe Scanner. Nous pouvons l’instancier avec System.in comme source d’entrée et lire l’entrée utilisateur.

// lire l'entrée utilisateur
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();

Sortie :

Please enter your name
Pankaj
Hello Pankaj

Eh bien, cela semble facile et fonctionne bien. Mais le code ci-dessus a un problème. Sans lire la section suivante, pouvez-vous vérifier le code et essayer de l’identifier ?

Voyons ce qui se passe lorsque j’écris mon nom complet en entrée.

Please enter your name
Pankaj Kumar
Hello Pankaj

Maintenant, vous devez l’avoir compris, cela se produit parce que l’espace blanc est le délimiteur. Le scanner divise l’entrée en deux jetons – Pankaj et Kumar. Mais nous appelons la méthode next() une seule fois, donc seul « Bonjour Pankaj » est imprimé.

Comment pouvons-nous résoudre cela ?

C’est simple. Nous pouvons changer le délimiteur en un caractère de nouvelle ligne en utilisant la méthode 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. Analyse des données de fichier à l’aide de Scanner

Jetons un coup d’œil à un exemple simple pour lire et analyser des fichiers CSV en utilisant la classe scanner. Disons que j’ai un fichier employees.csv avec le contenu suivant.

1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO

Lisons le fichier et obtenons une liste d’employés dans notre programme 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 + "]";
	}
}
  • // créer un scanner pour le fichier CSV
  • // définir le délimiteur comme une nouvelle ligne pour lire une ligne comme un seul jeton
  • // créer la liste des employés

// fermer le scanner

// imprimer les enregistrements des employés

// créer un scanner pour l’enregistrement de chaîne

// définir le délimiteur comme une virgule
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);

// fermer le scanner
sc1.useDelimiter("\\D");

while(sc1.hasNext()) {
	System.out.println(sc1.next());
}

La première étape consiste à créer le scanner pour le fichier CSV et à définir une nouvelle ligne comme délimiteur.
sc1.close();

Ensuite, pour chaque ligne contenant un enregistrement d’employé au format CSV, l’analyser en utilisant un autre scanner et une virgule comme délimiteur. La fonction parseEmployeeData() analyse chaque ligne et crée un objet Employee.

1
2
345
67
8
9
10

Enfin, nous ajoutons l’objet employee à la liste et l’imprimons.

Sortie: [Emp[1,Jane Doe,PDG], Emp[2,Mary Ann,DG], Emp[3,John Lee,DG Financier]]

3. Exemple d’expression régulière du scanner Java

Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java