Wie kann ich den Scanner-Puffer in Java löschen?

Lesezeit: 4 Minuten

Benutzer-Avatar
Leo Jiang

Ich habe so etwas:

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

Wie kann ich den Puffer löschen?

Edit: Ich habe folgendes versucht, aber es funktioniert aus irgendeinem Grund nicht:

while(in.hasNext())
    in.next();

  • Was meinst du mit “Puffer löschen”? Konsole löschen (wie der Befehl cls dos)?

    – Davide Consonni

    15. Mai 2012 um 15:38 Uhr

  • Ich suche etwas in der Art von: while(in.hasNext()) in.next();. Aus irgendeinem Grund funktioniert diese Schleife nicht.

    – Leo Jiang

    15. Mai 2012 um 20:38 Uhr

Versuche dies:

in.nextLine();

Dadurch rückt der Scanner zur nächsten Zeile vor.

  • Manchmal werden mehrere Zeilen eingegeben, dies funktioniert nur für eine Zeile.

    – Leo Jiang

    15. Mai 2012 um 20:39 Uhr

  • Sie würden denken, dass hasNextLine (oder hasNext) verwendet werden könnte, um zu prüfen, ob mehr Eingaben verfügbar sind, aber das funktioniert nicht in Java. Die Methoden hasNextLine/hasNext geben für die Tastatur (System.in) immer true zurück. Die einzige Möglichkeit, die ich gefunden habe, um alle gepufferten Daten ohne Blockierung zu löschen, besteht darin, einen neuen Scanner zu öffnen: in.close(); in = neuer Scanner (System.in);

    – Georgie

    13. Januar 2018 um 23:12 Uhr


  • @Georgie Sie möchten den neuen Scanner erstellen, ohne den alten zu schließen. Durch das Schließen des Scanners wird auch das zugrunde liegende lesbare Element (in unserem Fall System.in) geschlossen, sodass ich beim nächsten Aufruf von Scanner.next() NoSuchElementExceptions erhalte, wenn ich einen System.in-Scanner schließe und einen anderen erstelle. Wenn Sie das alte wirklich schließen müssen, schlägt diese StackOverflow-Antwort vor, dass Sie dies umgehen können, indem Sie einen Wrapper für System.in erstellen, wenn Sie es zuerst schließen möchten.

    – SansWit

    7. Mai 2019 um 22:23 Uhr


  • @SansWit Funktioniert für mich unter Java 8 Update 211, Windows 7. Möglicherweise ist das Verhalten in verschiedenen JVM-Implementierungen/Java-Versionen unterschiedlich, was schlecht wäre.

    – Georgie

    14. Mai 2019 um 7:18 Uhr

Sie können den Puffer des Scanners nicht explizit löschen. Intern kann es den Puffer löschen, nachdem ein Token gelesen wurde, aber das ist ein Implementierungsdetail außerhalb der Reichweite der Programmierer.

Verwenden Sie den folgenden Befehl:

in.nextLine();

gleich nach

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

oder nach der folgenden geschweiften Klammer (wo Ihr Kommentar dazu steht).

Dieser Befehl rückt den Scanner zur nächsten Zeile vor (beim Lesen aus einer Datei oder einem String liest dies einfach die nächste Zeile), wodurch er in diesem Fall im Wesentlichen gelöscht wird. Es löscht den Puffer und bereitet den Scanner für eine neue Eingabe vor. Es kann vorzugsweise zum Löschen des aktuellen Puffers verwendet werden, wenn ein Benutzer eine ungültige Eingabe gemacht hat (wie z. B. einen Buchstaben, wenn er nach einer Zahl gefragt wird).

Eine Dokumentation der Methode finden Sie hier:
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

Hoffe das hilft!

Das sollte es beheben…

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

Benutzer-Avatar
SansWit

Andere Leute haben vorgeschlagen, zu verwenden in.nextLine() um den Puffer zu löschen, was für einzeilige Eingaben funktioniert. Wie aus Kommentaren hervorgeht, kann die System.in-Eingabe jedoch manchmal mehrzeilig sein.

Sie können stattdessen ein neues Scanner-Objekt erstellen, in dem Sie den Puffer löschen möchten, wenn Sie System.in und keinen anderen InputStream verwenden.

in = new Scanner(System.in);

Wenn du das tust, nicht Forderung in.close() Erste. Dadurch wird System.in geschlossen, und Sie erhalten NoSuchElementExceptions bei nachfolgenden Aufrufen von in.nextInt(); System.in sollte während Ihres Programms wahrscheinlich nicht geschlossen werden.

(Der obige Ansatz ist spezifisch für System.in. Er ist möglicherweise nicht für andere Eingabeströme geeignet.)

Wenn Sie Ihr Scanner-Objekt wirklich schließen müssen, bevor Sie ein neues erstellen, schlägt diese StackOverflow-Antwort vor, einen InputStream-Wrapper für System.in zu erstellen, der über eine eigene close()-Methode verfügt, die den umschlossenen System.in-Stream nicht schließt. Dies ist jedoch für einfache Programme übertrieben.

  • Das Erstellen eines NEUEN Scanner-Objekts war der beste Vorschlag! Stellen Sie jedoch sicher, dass KEINE REFERENZ auf das ALTE Scannerobjekt vorhanden ist, damit dies der Fall sein kann Müll gesammelt.

    – RafiAlhamd

    24. November 2019 um 6:03 Uhr

Benutzer-Avatar
Kamran Riyaz

scan.nextLine();

Setzen Sie die obige Zeile vor dem Lesen der String-Eingabe

  • Das Erstellen eines NEUEN Scanner-Objekts war der beste Vorschlag! Stellen Sie jedoch sicher, dass KEINE REFERENZ auf das ALTE Scannerobjekt vorhanden ist, damit dies der Fall sein kann Müll gesammelt.

    – RafiAlhamd

    24. November 2019 um 6:03 Uhr

1014770cookie-checkWie kann ich den Scanner-Puffer in Java löschen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy