Lire les entrées clavier en Java
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éthode | Description |
---|---|
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. |
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 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 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 nom : mostafa
Saisir votre salaire : 8000.35
[nom = mostafa , age = 25 , salaire =8000.35]