Comment puis-je effacer le tampon du Scanner en Java?


J'ai quelque chose comme ça:

    Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");

Comment puis-je effacer le tampon?

Edit: J'ai essayé ce qui suit, mais cela ne fonctionne pas pour une raison quelconque:

while(in.hasNext())
    in.next();
Author: Leo Jiang, 2012-05-15

5 answers

Vous ne pouvez pas effacer explicitement le tampon du scanner. En interne, il peut effacer le tampon après la lecture d'un jeton, mais c'est un détail d'implémentation en dehors de la portée des porgrammers.

 16
Author: Óscar López, 2012-05-15 15:39:36

Essayez ceci:

in.nextLine();

Cela fait passer le scanner à la ligne suivante.

 41
Author: Makoto, 2012-05-15 15:38:16

Utilisez la commande suivante:

in.nextLine();

Juste après

System.out.println("Invalid input. Please Try Again.");
System.out.println();

Ou après l'accolade suivante (où est votre commentaire à ce sujet).

Cette commande fait passer le scanner à la ligne suivante (lors de la lecture à partir d'un fichier ou d'une chaîne, elle lit simplement la ligne suivante), la vidant donc essentiellement, dans ce cas. Il efface le tampon et prépare le scanner pour une nouvelle entrée. Il peut, de préférence, être utilisé pour effacer le tampon actuel lorsqu'un utilisateur a entré une entrée non valide (comme une lettre lorsqu'on lui demande un numéro).

La documentation de la méthode peut être trouvée ici: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

J'espère que cela aide!

 11
Author: Gunnar Södergren, 2014-08-28 07:35:50

Cela devrait le réparer...

Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            in.next(); // -->important
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");
 7
Author: rejun, 2014-05-06 06:47:20

D'autres personnes ont suggéré d'utiliser in.nextLine() pour effacer le tampon, ce qui fonctionne pour l'entrée à une seule ligne. Comme le soulignent les commentaires, cependant, parfois System.in l'entrée peut être multi-ligne.

Vous pouvez plutôt créer un nouvel objet Scanner où vous souhaitez effacer le tampon si vous utilisez System.in et pas un autre InputStream.

in = new Scanner(System.in);

Si vous faites cela, n'appelez pas en premier. Cela fermera System.in, et ainsi vous obtiendrez NoSuchElementExceptions sur les suivants appels à in.nextInt(); System.in ne devrait probablement pas être fermé pendant votre programme.

(L'approche ci-dessus est spécifique à System.in. Il peut ne pas être approprié pour d'autres flux d'entrée.)

Si vous avez vraiment besoin de fermer votre objet Scanner avant d'en créer un nouveau, cette réponse StackOverflow suggère de créer un wrapper InputStream pour System.in qui a sa propre méthode close () qui ne ferme pas l'encapsulé System.in flux. C'est exagéré pour les programmes simples, cependant.

 6
Author: SansWit, 2019-05-08 03:22:41