hasNext() wartet auf Eingabe

  • Hallo,

    ich hab folgendes Problem: ich frag bei einem Scannerobjekt mit hasNext() ab ob noch was ausgelesen werden kann. Aber anstatt das Java false liefert wenn kein Zeichen mehr da ist, wartet mein Programm einfach bis eine eingabe getätigt wurde. Anders gesagt, solange bis hasNext() true ist. Damit wäre aber das hasNext() ad absurdum geführt und hätte keinen Sinn. Kann man mir sagen was ich falsch mach, bzw. wie man das lösen könnte?

    lg elundril

    Mit Leib und Seele Programmierer mit Delphi

  • Das ist gar nicht ad absurdum geführt, aber wenn das Programm auf einer Konsole läuft, kann es ja nie wissen, ob noch was kommt, daher muss es warten.

    Wenn du es beenden willst, musst du ein EOF schicken (üblicherweise Ctrl-D unter Unix und Ctrl-Z unter Windows). Oder du schickst mittels Pipe ein File in den Standardinput deines Programms hinein. Dann ist es einfach aus, wenn das File aus ist.

  • Danke! Funktioniert jetzt reibungslos!

    Das heißt die Scannerklasse dient eigentlich nur zum Einlesen von Files, oder? denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

    Mit Leib und Seele Programmierer mit Delphi

  • Das heißt die Scannerklasse dient eigentlich nur zum Einlesen von Files, oder? denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

    Nein, ist vollkommen wurscht. Normalerweise wartet man bei der Konsole auf '\n' und bricht dann ab. Stell dir einfach den Zeilenumbruch als Delimiter ein dann müsste der Scanner eh aufhören.

    There's no better place than 127.0.0.1!

  • Zitat von elundril


    Das heißt die Scannerklasse dient eigentlich nur zum Einlesen von Files, oder? denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

    Nein, der Scanner liest jede Art von Stream, zum Beispiel von einem Netzwerk, einer Datenbank, oder einem Marsroboter. Der "Benutzer", also die Instanz, die den Stream mit Daten füttert, ist meistens ein Computerprogramm, das dann auch das EOF mitschickt.

    Du hast aber Recht, das es eher unueblich ist, die Daten über die Kommandozeile interaktiv, also über einen "Dialog mit dem Computer", einzulesen. Viel öfter kommt es zum Beispiel vor, dass der Standard Input Stream ("System.in") mit einem Filestream gefüttert wird, der dann am Ende automatisch ein EOF schickt. Zum Beispiel:

    Code
    $ echo "Das sind vier Woerter" | wc -w
    4


    Normalerweise wartet man bei der Konsole auf '\n' und bricht dann ab.


    Fuer diesen Fall sind vermutlich die Methoden Scanner#hasNextLine() bzw Scanner#nextLine() besser geeignet, denn die arbeiten plattformunabhängig, mit System.getProperty('line.separator') als Delemiter. '\n' ist ja nicht zwingend das Zeichen für einen Zeilenumbruch.

    lg, Benjamin Ferrari, bookworm.at

    6 Mal editiert, zuletzt von a9bejo (19. November 2008 um 09:06)

  • Fuer diesen Fall sind vermutlich die Methoden Scanner#hasNextLine() bzw Scanner#nextLine() besser geeignet, denn die arbeiten plattformunabhängig, mit System.getProperty('line.separator') als Delemiter. '\n' ist ja nicht zwingend das Zeichen für einen Zeilenumbruch.

    Das soundso.

    java-girl meinte anscheinend, dass der Scanner bei \n ein Token liefert (also wenn man auf der Konsole Enter drückt). Ja, tut er üblicherweise. Aber von "abbrechen" kann keine Rede sein. Du kannst ja auch noch mehr Zeilen eintippen wollen.

  • java-girl meinte anscheinend, dass der Scanner bei \n ein Token liefert (also wenn man auf der Konsole Enter drückt). Ja, tut er üblicherweise. Aber von "abbrechen" kann keine Rede sein. Du kannst ja auch noch mehr Zeilen eintippen wollen.

    Nein, du hast mich wohl falsch verstanden. Ich meinte, dass man wenn man von der Konsole liest und den Scanner verwendet und nur eine oder eine bestimmte Anzahl von Zeilen lesen will abbricht. Beim Scanner kann man scheinbar als "End"-Delimiter scheinbar nichts einstellen ist mir jetzt aufgefallen, aber bei anderen StreamReadern geht das wenn ich mich recht erinnere. Die hören dann von selbst auf.

    There's no better place than 127.0.0.1!

  • Man kann ein Abbrechen bei Zeilenende auch ganz leicht folgendermaßen bewerkstelligen:

    Code
    Scanner s = new Scanner(System.in);
    s = new Scanner(s.nextLine());

    Nun hat man lediglich eine Zeile als Stream.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!