web-dev-qa-db-fra.com

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();
21
Leo Jiang

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 il s'agit d'un détail d'implémentation hors de portée des porgrammers.

8
Óscar López

Essaye ça:

in.nextLine();

Ceci fait avancer le scanner à la ligne suivante.

26
Makoto

Utilisez la commande suivante: 

in.nextLine();

juste après

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

ou après la parenthèse suivante (où se trouve votre commentaire à ce sujet).

Cette commande fait avancer le scanner à la ligne suivante (lors de la lecture d'un fichier ou d'une chaîne, la ligne suivante est simplement lue), ce qui la purge 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 saisi une entrée invalide (telle qu'une lettre lorsqu'un numéro lui est demandé). 

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 t'aides!

5
Gunnar Södergren

Cela devrait résoudre le problème ...

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.");
5
rejun

D'autres personnes ont suggéré d'utiliser in.nextLine() pour effacer le tampon, ce qui fonctionne pour une entrée sur une seule ligne. Comme le soulignent les commentaires, les entrées System.in peuvent parfois être multilignes.

Vous pouvez plutôt créer un nouvel objet Scanner dans lequel 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 d'abord in.close(). Cela ferme System.in et vous obtiendrez donc NoSuchElementExceptions lors d'appels ultérieurs à in.nextInt(); System.in ne devrait probablement pas être fermé pendant votre programme.

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

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

0
SansWit

Cela fonctionne pour moi. Ce n'est pas complètement fiable car available () n'est qu'une estimation, mais je veux juste effacer la plupart des entrées après qu'un utilisateur ait appuyé sur une touche pour la faire répéter. Cela ne me dérange pas d'avoir un ou deux personnages supplémentaires.

        System.in.skip(System.in.available());
0
trindflo