Lire les entrées clavier en Java

14 Sep 2019 14 Sep 2019 30215 vues ESSADDOUKI Mostafa 7 min de lecture
Introduction
1 Nouveautés de Java 11 2 Différences entre JDK, JRE et JVM 3 Structure d'un programme Java - Hello World 4 Mots clés et conventions de dénomination en Java 5 Types de données intégrés en Java 6 Les variables en Java 7 Classes enveloppe - Number, Integer, Double ... 8 Lire les entrées clavier en Java
Structures de contrôle
9 Les opérateurs en Java 10 Les structures conditionnelles en Java 11 Les boucles en Java 12 Instructions de contrôle de boucle - break, continue
Chaines de caractères
13 Les chaines en Java - API String 14 Les chaines en Java - StringBuffer et StringBuilder 15 Les expressions régulières en Java
Programmation OO
16 Objets et classes en Java 17 Modificateurs d'accès Java - public, private, protected et package 18 Méthodes et surcharge des méthodes en Java 19 les constructeurs en Java 20 L'héritage en Java 21 Classes abstraites en Java 22 Interfaces et héritage multiple en Java 23 Les classes imbriquées en Java 24 Les singletons en Java 25 Classes et méthodes génériques 26 Interface fonctionnelle et expressions Lambda en Java
Tableaux et collections
27 Les tableaux en Java 28 Classe Arrays - java.util.Arrays 29 Les listes dynamiques - java.util.ArrayList 30 Les listes chaînées en Java - java.util.LinkedList 31 HashSet en Java - java.util.HashSet 32 HashMap en Java - java.util.HashMap
Gestion des fichiers
33 Comprendre les fichiers informatiques 34 Utilisation des classes Path et Files en Java 35 Lecture et écriture dans un fichier en Java 36 Fichiers à accès aléatoire en Java
Gestion d'exceptions
37 Gestion d'exceptions en Java 38 Créez vos propres classes d'exception en Java
Programmation concurrente
39 Introduction à la programmation concurrente en Java - Multi-threads 40 classe java.lang.Thread 41 Synchronisation des threads en Java
Cours Java pour les débutants — Étape 8 sur 41

Pour créer des programmes interactifs acceptant les entrées d'un utilisateur, vous pouvez utiliser System.in, qui fait référence au périphérique d'entrée standard (généralement le clavier).

L'objet System.in n'est pas aussi flexible que System.out; il est conçu pour ne lire que des octets. C’est un problème, car vous voulez souvent accepter des données d’autres types. Heureusement, les concepteurs de Java ont créé une classe nommée Scanner qui rend System.in plus flexible.

Pour créer un objet Scanner et le connecter à l'objet System.in, vous écrivez une instruction similaire à celle-ci:

                                Scanner clavier = new Scanner(System.in);
                            

La classe Scanner contient des méthodes permettant d'extraire des valeurs d'un périphérique d'entrée. Chaque valeur extraite est un jeton, qui est un ensemble de caractères séparé du prochain ensemble par des espaces. Le plus souvent, cela signifie que les données sont acceptées lorsqu'un utilisateur appuie sur la touche Entrée, mais cela peut également signifier qu'un jeton est accepté après un espace ou une tabulation.

Le tableau suivant récapitule certaines des méthodes les plus utiles pour lire différents types de données à partir du périphérique d'entrée par défaut.

MéthodeDescription
nextDouble()Récupère l'entrée en tant que Double
nextInt()Récupère l'entrée en tant que int
nextLine()Récupère la ligne de données suivante et la renvoie sous forme de chaîne (String)
next()Récupère le prochain jeton complet sous forme de chaîne
nextShort()Récupère l'entrée en tant que Short
nextByte()Récupère l'entrée en tant que octet (Byte)
nextFloat()Récupère les entrées sous forme de float. Notez que lorsque vous entrez une valeur d'entrée qui sera stockée sous forme de float, vous ne tapez pas de F. Le F est utilisé uniquement avec les constantes codées dans un programme.
nextLong()Récupère l'entrée en tant que long. Notez que lorsque vous entrez une valeur d'entrée qui sera stockée longtemps, vous ne tapez pas un L. Le L est utilisé uniquement avec des constantes codées dans un programme.
 Remarque !  La classe Scanner ne contient pas de méthode nextChar(). Pour extraire un seul caractère du clavier, vous pouvez utiliser la méthode nextLine(), puis la méthode charAt().
Exemple 1 :
                                    import java.util.Scanner;

                                    public class Test {
                                        public static void main(String args[]) {
                                            String nom;
                                            int age;
                                            double salaire;
                                            Scanner clavier = new Scanner(System.in);
                                            System.out.print("Saisir votre nom : ");
                                            nom = clavier.nextLine();
                                    
                                            System.out.print("Saisir votre age : ");
                                            age = clavier.nextInt();
                                    
                                            System.out.print("Saisir votre salaire : ");
                                            salaire = clavier.nextDouble();
                                    
                                            System.out.println("[nom = " + nom + " , age = " + age + " , salaire =" + salaire + "]");
                                    
                                            // fermer les ressources
                                            clavier.close();
                                    
                                        }
                                    }
                            
Saisir votre nom : Mostafa
Saisir votre age : 13
Saisir votre salaire : 9000.34
[nom = Mostafa , age = 13 , salaire =9000.34]

Si vous utilisez l'une des méthodes Scanner et que le jeton suivant ne peut pas être converti dans le type de données approprié, vous recevez un message d'erreur.

Piège de nextLine()

Vous pouvez rencontrer un problème lorsque vous utilisez l'une des méthodes d'extraction de classe numérique Scanner ou la méthode next() avant d'utiliser la méthode nextLine(). Considérez le programme suivant. Il est identique à celui ci-dessus, sauf que l'utilisateur est invité à saisir l'âge avant de lui demander le nom.

Exemple 2 :
                                    import java.util.Scanner;

                                    public class Test {
                                        public static void main(String args[]) {
                                            String nom;
                                            int age;
                                            double salaire;
                                            Scanner clavier = new Scanner(System.in);
                                    
                                            System.out.print("Saisir votre age : ");
                                            age = clavier.nextInt();
                                    
                                            System.out.print("Saisir votre nom : ");
                                            nom = clavier.nextLine();
                                    
                                            System.out.print("Saisir votre salaire : ");
                                            salaire = clavier.nextDouble();
                                    
                                            System.out.println("[nom = " + nom + " , age = " + age + " , salaire =" + salaire + "]");
                                    
                                            // fermer les ressources
                                            clavier.close();
                                    
                                        }
                                    }
                            
Saisir votre age : 25
Saisir votre nom : Saisir votre salaire : 7000
[nom = , age = 25 , salaire =7000.0]

Dans l'exemple ci-dessus, l'utilisateur est invité correctement pour saisir l'age. Toutefois, une fois que l'utilisateur a saisi l'âge et que l'invite du nom est affichée, le programme ne s'interrompt pas pour lui permettre de saisir un nom. Au lieu de cela, le programme passe directement à l'instruction suivante et la sortie ne contient pas un nom valide.

Lorsque vous tapez des caractères à l'aide du clavier, ils sont stockés temporairement dans un emplacement de la mémoire appelé mémoire tampon du clavier ou mémoire tampon de frappe anticipée. Toutes les frappes au clavier sont stockées dans la mémoire tampon du clavier, y compris la touche Entrée. Le problème est dû à une différence dans le fonctionnement de la méthode nextLine() et des autres méthodes de récupération du scanner:

  •   Les méthodes next(), nextInt() et nextDouble() extraient le prochain jeton dans la mémoire tampon jusqu'au prochain espace blanc, qui peut être un espace, une tabulation ou une touche Entrée.
  •   La méthode nextLine() lit toutes les données jusqu'au caractère de la touche Entrée.

Ainsi, lors de l'exécution du programme, l'utilisateur est invité à entrer un âge, tapez 25 et appuyez sur Entrée. L'appel à la méthode nextInt() récupère 25 et laisse la touche Entrée enfoncée dans le tampon d'entrée. Ensuite, l'invite relative au nom s'affiche et l'appel de nextLine() récupère la touche Entrée en attente avant que l'utilisateur n'ait le temps de taper un nom.

La solution au problème est simple. Après tout appel à next(), nextInt() ou nextDouble(), vous pouvez ajouter un appel supplémentaire à la méthode nextLine() qui permettra de récupérer le caractère de touche Entrée abandonné. Ensuite, quel que soit le type d’entrée suivi, le programme s’exécutera correctement.

Exemple 3 :
                                    import java.util.Scanner;

                                    public class Test {
                                        public static void main(String args[]) {
                                            String nom;
                                            int age;
                                            double salaire;
                                            Scanner clavier = new Scanner(System.in);
                                    
                                            System.out.print("Saisir votre age : ");
                                            age = clavier.nextInt();
                                            clavier.nextLine();
                                    
                                            System.out.print("Saisir votre nom : ");
                                            nom = clavier.nextLine();
                                    
                                            System.out.print("Saisir votre salaire : ");
                                            salaire = clavier.nextDouble();
                                            clavier.nextLine();
                                    
                                            System.out.println("[nom = " + nom + " , age = " + age + " , salaire =" + salaire + "]");
                                    
                                            // fermer les ressources
                                            clavier.close();
                                    
                                        }
                                    }
                            
Saisir votre age : 25
Saisir votre nom : mostafa
Saisir votre salaire : 8000.35
[nom = mostafa , age = 25 , salaire =8000.35]

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.