JavaRush /Blog Java /Random-FR /Classe de scanner en Java

Classe de scanner en Java

Publié dans le groupe Random-FR
Bonjour! Notre leçon d'aujourd'hui sera spéciale ! Avant cela, lors de la résolution de problèmes et de l'écriture de programmes, l'algorithme était simple : nous écrivons du code, exécutons la méthode main() , le programme fait ce qu'on lui demande et se termine. Mais maintenant, tout va changer ! Aujourd'hui, nous allons apprendre à véritablement interagir avec le programme : nous lui apprendrons à répondre à nos actions ! Vous comprenez peut-être déjà où nous voulons en venir. Nous consacrerons cette conférence à une analyse détaillée de l’une des classes du langage Java – Scanner. Cette classe sera utile si vous avez besoin de lire les données saisies par les utilisateurs. Avant de passer à l'apprentissage du code, dites-moi, avez-vous déjà rencontré un appareil tel qu'un scanner ? Sûrement oui. La structure interne du scanner est assez complexe, mais l'essence de son travail est assez simple : il lit les données que l'utilisateur y saisit (par exemple, un passeport ou une police d'assurance) et stocke les informations lues en mémoire (par exemple , sous forme d'image). Alors aujourd’hui, vous allez créer votre propre scanner ! Bien sûr, il ne sait pas gérer les documents, mais il gère très bien les informations textuelles :) C'est parti !Classe de scanner - 1

Classe de scanner Java

La première et la plus importante chose avec laquelle nous devons nous familiariser est la classe java.util.Scanner. Sa fonctionnalité est très simple. Comme un vrai scanner, il lit les données de la source que vous lui avez spécifiée. Par exemple, depuis une ligne, depuis un fichier, depuis la console. Ensuite, il reconnaît ces informations et les traite selon les besoins. Donnons l'exemple le plus simple :
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Nous avons créé un objet scanner et spécifié une source de données pour celui-ci (une chaîne avec du texte). La méthode nextLine()accède à la source de données (notre texte avec des quatrains), y trouve la ligne suivante qu'elle n'a pas encore lue (dans notre cas, la première) et la renvoie. Après quoi nous l'envoyons à la console : Sortie de la console :

Люблю тебя, Peterа творенье,
Nous pouvons utiliser la méthode nextLine()plusieurs fois et sortir le morceau entier du poème :
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
À chaque fois, notre scanner fera un pas en avant et lira la ligne suivante. Le résultat du programme est affiché sur la console :

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Comme nous l'avons déjà dit, la source de données du scanner peut être non seulement une chaîne, mais aussi, par exemple, une console. Nouvelle importante pour nous : si auparavant nous n'y éditions que des données, désormais nous saisirons les données à partir du clavier ! Voyons ce que la classe Scanner peut faire d'autre :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
La méthode nextInt()lit et renvoie le numéro saisi. Dans notre programme, il est utilisé pour attribuer une valeur à une variable number. Cela ressemble plus à un vrai scanner ! Le programme demande à l'utilisateur de saisir n'importe quel numéro sur une ligne. Une fois que l'utilisateur a fait cela, le programme le remercie, affiche le résultat de son travail sur la console et se termine. Mais nous avons encore un problème sérieux. L'utilisateur peut faire une erreur et saisir quelque chose de mal. Voici un exemple de moment où notre programme actuel cesserait de fonctionner :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Essayons de saisir la chaîne « JavaRush » au lieu d'un nombre : Sortie de la console :
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:864)
  at java.util.Scanner.next(Scanner.java:1485)
  at java.util.Scanner.nextInt(Scanner.java:2117)
  at java.util.Scanner.nextInt(Scanner.java:2076)
  at Main.main(Main.java:10)

Process finished with exit code 1
Oups, tout va mal -_- Pour éviter de telles situations, nous devons trouver un moyen de valider les données saisies par l'utilisateur. Par exemple, si l'utilisateur saisit autre chose qu'un nombre, il serait bien d'afficher un avertissement dans la console indiquant que les informations saisies ne sont pas un nombre, et si tout est en ordre, d'afficher un texte de confirmation. Mais pour ce faire, nous devons en réalité « regarder vers l’avenir » – découvrir la suite de notre flux. Le scanner en Java peut-il faire cela ? Comment peut-il ! Et pour cela, il dispose de tout un groupe de méthodes : hasNextInt()- la méthode vérifie si la partie suivante des données saisies est un nombre ou non (renvoie respectivement vrai ou faux). hasNextLine()- vérifie si la donnée suivante est une chaîne. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- toutes ces méthodes font la même chose pour les autres types de données. Essayons de changer notre programme pour lire les nombres :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thank you! You entered a number" + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Notre programme vérifie maintenant si le prochain caractère saisi est un nombre ou non. Et seulement si c'est le cas, il affiche une confirmation. Si l'entrée ne réussit pas le test, le programme le remarque et vous demande de réessayer. Essentiellement, vous pouvez communiquer avec l’objet Scanner et savoir à l’avance à quel type de données vous attendre. « Hé, scanner, quelle est la prochaine étape ? Nombre, chaîne ou autre chose ? Nombre? Et lequel - int, short, long?" Cette flexibilité vous donne la possibilité de construire la logique de votre programme en fonction du comportement des utilisateurs. Une autre méthode importante à laquelle il convient de prêter attention est useDelimiter(). Cette méthode reçoit la chaîne que vous souhaitez utiliser comme délimiteur. Par exemple, nous nous sommes soudainement intéressés à la poésie japonaise et avons décidé d'utiliser le scanner pour lire plusieurs haïkus du grand poète Matsuo Basho. Même si trois versets différents nous sont donnés dans une seule ligne maladroite, nous pouvons facilement les séparer et les formater joliment :
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

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

       scan.close();
   }
}
Nous utilisons la méthode useDelimeter() de la classe Scanner comme séparateur de ligne : elle est chargée de diviser les données entrantes en parties. Dans notre cas, un guillemet simple ( "'" ) est passé en argument et utilisé pour séparer les chaînes . Le texte qui suit cette citation apparaît sur une nouvelle ligne car dans la boucle while nous utilisons la méthode println() de la classe System pour lire les données. Du coup, nous aurons un beau résultat dans la console, tout comme dans les livres :
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Dans le même exemple, il existe une autre méthode à laquelle vous devez absolument prêter attention - close(). Comme tout objet qui fonctionne avec des flux d'E/S, le scanner doit être fermé lorsqu'il termine son travail afin qu'il ne consomme plus les ressources de notre ordinateur. N'oubliez jamais la méthode close()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
C'est tout! Comme vous pouvez le constater, la classe Scanner est assez simple à utiliser et très utile ! :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION