L’utilisation du langage Java dans le Big Data est indiscutable puisqu’il est la source des frameworks massivement parallèles tels que Hadoop ou Kafka ainsi que de plusieurs autres outils utilisés dans ce domaine. Tout développeur Java qui se respecte et qui souhaite développer des applications Big Data performantes se doit de bien maitriser les packages nécessaires.

Nous avons déjà évoqué certains packages tels que le Java.util.Map. Dans cet article, nous restons toujours dans cette même lancée en abordant le Scanner de Java.

En effet, la prise en charge des entrées de l’utilisateur est l’une des fonctionnalités les plus importantes d’un programme informatique. L’entrée de l’utilisateur peut prendre de nombreuses formes : interactions avec la souris et le clavier, requête réseau, arguments de ligne de commande, fichiers mis à jour avec des données pertinentes pour l’exécution d’un programme, etc. Dans une application axée sur le Big Data, l’importance réside dans la véracité et la variabilité des données récoltées. Une bonne prise en charge des entrées de l’utilisateur garantira donc une bonne évolutivité de l’architecture et facilitera d’autant plus l’analyse à des fins décisionnelles.

Dans cette chronique, nous allons nous concentrer sur l’entrée du clavier via ce que l’on appelle le flux d’entrée standard, connus également sous le nom de System.in de Java.

Création et utilisation de l’outil Scanner

En Java, la classe Scanner permet à un utilisateur d’écrire du texte et au programme de lire ce texte. Afin de mieux comprendre les différentes facettes de la programmation Java, vous pouvez vous référer à notre chronique Apprendre la programmation Java : le guide complet.

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);
    }
}

Voici un exemple de programme qui demande à un utilisateur de saisir un nombre et affiche ce nombre à l’écran.

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.prints("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);
    }
}

Ici, l’appel scanner.nextInt() est laissé en attente jusqu’à ce que l’utilisateur écrive quelque chose. Lorsque l’utilisateur écrit et ensuite appuie sur la touche Entrée, le nombre fourni est affecté à une variable nombre.

Maintenant, testons notre programme et regardons ce qui se produit. Dans cet exemple l’utilisateur saisit le nombre 40.

Ecrire un nombre: 40
40

Le nombre 40 est donc affecté à la variable nombre et qu’ensuite, le programme affiche le nombre à l’écran. C’est donc la preuve que les méthodes que ce package propose sont essentielles afin de mieux lire chaque entrée.

La classe Scanner fournit de nombreuses méthodes pour lire et analyser diverses valeurs primitives. Nous allons voir chacune de ces méthodes dans la suite de cette chronique.

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. Dans ce tableau, nous vous les présentons avec ce qu’elles effectuent exactement.

MéthodesDescription
String next()Renvoie le prochain token complet de l’analyseur
byte nextByte()Renvoie un byte lu au clavier
double nextDouble()Renvoie un double lu au clavier
float nextFloat()Renvoie un float lu au clavier
int nextInt()Renvoie un int lu au clavier
long nextLong()Renvoie un long lu au clavier
short nextShort()Renvoie un short lu au clavier
boolean nextBoolean()Renvoie un boolean lu au clavier
String nextLine()Renvoie une chaîne de caractère lu au clavier
boolean hasNext()Retourne « vrai » si le scanner a une autre donnée dans son entrée
boolean hasNextInt()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
boolean hasNextFloat()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
boolean hasNextLineVérifie s’il y a une autre ligne dans l’entrée de ce scanner ou non

Comment utiliser la classe Scanner Java pour lire un fichier ?

À travers l’exemple qui suit, nous allons voir comment l’outil Scanner lit un fichier.

Le programme Java suivant utilise la méthode nextLine() pour lire un fichier texte ligne par ligne, et affiche chaque ligne à l’écran .Si vous souhaitez reproduire cet exemple chez vous, sachez qu’avant l’exécution de ce programme, vous devez créer un fichier nommé « data.txt« , ajoutez-y quelques lignes et lancez le programme une fois ce fichier créé.

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

public class Programme {

    public static void main(String[] args) throws FileNotFoundException {
        String nom_fichier = "data.txt";

        try (Scanner scanner = new Scanner(new File(nom_fichier))) {

            while (scanner.hasNext()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }
        }
    }
}

Dans ce petit exemple, le programme va essayer de créer une instance de la méthode scanner sur le fichier data.txt en utilisant la méthode try. Si vous souhaitez connaitre plus de détails sur cette méthode, nous avons publié un article entier sur la gestion des exceptions en Java. Et tant que le fichier contient des lignes à lire, il l’affichera à l’écran.

Effectuer des contrôles sur les données saisies par l’utilisateur avec l’outil Scanner Java

Il est possible avec la classe Scanner de préciser le format des données à saisir et que l’utilisateur doit respecter. Pour indiquer au scanner le format de la prochaine donnée à extraire, nous utilisons la méthode Scanner.next( regularExp ).

Si cette donnée ne correspond pas au format de votre expression régulière, une exception de type « java.util.InputMismatchException » sera déclenchée.

Dans l’exemple suivant, nous essayerons d’apporter un contrôle sur la saisie de l’e-mail d’un utilisateur en utilisant une expression régulière.

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");
        }

    }
}

Après exécution et test du programme ci-dessus on a les affichages suivants :

Veuillez saisir votre mail: data@gmail.com
data@gmail.com : Email valide !
Veuillez saisir votre mail: datagmail.com
Email non valide

Ici, on constate que si l’utilisateur commet une erreur lors de la saisie du mail, le programme le signale à travers un message. D’où l’importance de ce type de contrôle, qui est d’autant plus nécessaire lorsque l’on traite des données clients. En effet, dans le Big Data, malgré le fait que tout type de données est acceptable, il est toutefois nécessaire de garder une certaine cohérence pour que la base de données soit éligible.

Nous terminons donc cet article par ce chapitre. Vous avez toutes les cartes en main afin de concevoir un programme performant en utilisant pleinement l’outil Scanner de Java. Si vous souhaitez apprendre davantage à coder, vous pouvez lire notre guide ultime de la programmation informatique. Et si vous voulez, vous pouvez consulter la documentation officielle sur le site de Java pour aller plus loin.


Juvénal JVC

Juvénal est spécialisé depuis 2011 dans la valorisation à large échelle des données. Son but est d'aider les professionnels de la data à développer les compétences indispensables pour réussir dans le Big Data. Il travaille actuellement comme Lead Data Engineer auprès des grands comptes. Lorsqu'il n'est pas en voyage, Juvénal rédige des livres ou est en train de préparer la sortie d'un de  ses livres. Vous pouvez télécharger un extrait de son dernier livre en date ici : https://www.data-transitionnumerique.com/extrait-ecosystme-hadoop/

>