JavaRush /Java-Blog /Random-DE /Scannerklasse in Java

Scannerklasse in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! Unsere heutige Lektion wird etwas Besonderes sein! Zuvor war der Algorithmus beim Lösen von Problemen und beim Schreiben von Programmen einfach: Wir schreiben Code, führen die Methode main() aus , das Programm tut, was von ihm verlangt wird, und wird beendet. Aber jetzt wird sich alles ändern! Heute lernen wir, wie wir wirklich mit dem Programm interagieren: Wir werden ihm beibringen, auf unsere Aktionen zu reagieren! Möglicherweise verstehen Sie bereits, wohin wir damit wollen. Wir werden diese Vorlesung einer detaillierten Analyse einer der Java-Sprachklassen widmen – Scanner. Diese Klasse ist nützlich, wenn Sie von Benutzern eingegebene Daten lesen müssen. Bevor wir mit dem Erlernen des Codes fortfahren, sagen Sie mir: Sind Sie schon einmal auf ein Gerät wie einen Scanner gestoßen? Sicher ja. Der interne Aufbau des Scanners ist recht komplex, aber das Wesentliche seiner Arbeit ist recht einfach: Er liest die Daten, die der Benutzer eingibt (z. B. einen Reisepass oder eine Versicherungspolice) und speichert die gelesenen Informationen im Speicher (z. B , in Form eines Bildes). Heute erstellen Sie also Ihren eigenen Scanner! Natürlich kann er nicht mit Dokumenten umgehen, aber mit Textinformationen kommt er ganz gut klar :) Auf geht's!Scannerklasse - 1

Java-Scanner-Klasse

Das erste und wichtigste, mit dem wir uns vertraut machen müssen, ist der Unterricht java.util.Scanner. Seine Funktionalität ist sehr einfach. Wie ein echter Scanner liest er Daten aus der von Ihnen angegebenen Quelle. Zum Beispiel aus einer Zeile, aus einer Datei, aus der Konsole. Dann erkennt es diese Informationen und verarbeitet sie bei Bedarf. Geben wir das einfachste Beispiel:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner(„Ich liebe dich, Petra Schöpfung,\n“ +
               „Ich liebe deinen strengen, schlanken Blick,\n“ +
               „Souveräner Strom der Newa,\n“ +
               „Küstengranit“);
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Wir haben ein Scannerobjekt erstellt und eine Datenquelle dafür angegeben (eine Zeichenfolge mit Text). Die Methode nextLine()greift auf die Datenquelle (unser Text mit Vierzeilern) zu, findet dort die nächste Zeile, die sie noch nicht gelesen hat (in unserem Fall die erste) und gibt sie zurück. Anschließend geben wir es auf der Konsole aus: Konsolenausgabe:

Люблю тебя, Peterа творенье,
Wir können die Methode nextLine()mehrmals anwenden und den gesamten Teil des Gedichts ausgeben:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner(„Ich liebe dich, Petra Schöpfung,\n“ +
               „Ich liebe deinen strengen, schlanken Blick,\n“ +
               „Souveräner Strom der Newa,\n“ +
               „Küstengranit“);
       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);
   }
}
Jedes Mal macht unser Scanner einen Schritt vorwärts und liest die nächste Zeile. Das Ergebnis des Programms wird auf der Konsole ausgegeben:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Wie bereits erwähnt, kann die Datenquelle für den Scanner nicht nur ein String, sondern beispielsweise auch eine Konsole sein. Wichtige Neuigkeiten für uns: Wenn wir bisher nur Daten dort ausgeben, geben wir jetzt Daten über die Tastatur ein! Mal sehen, was die Scanner- Klasse sonst noch kann :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println(„Geben Sie die Nummer ein:“);

       int number = sc.nextInt();

       System.out.println(„Vielen Dank! Sie haben eine Nummer eingegeben.“ + number);

   }
}
Die Methode nextInt()liest die eingegebene Zahl und gibt sie zurück. In unserem Programm wird es verwendet, um einer Variablen einen Wert zuzuweisen number. Das sieht eher aus wie ein echter Scanner! Das Programm fordert den Benutzer auf, eine beliebige Zahl in eine Zeile einzugeben. Nachdem der Benutzer dies getan hat, bedankt sich das Programm bei ihm, zeigt das Ergebnis seiner Arbeit auf der Konsole an und endet. Aber wir haben immer noch ein ernstes Problem. Der Benutzer kann einen Fehler machen und etwas Falsches eingeben. Hier ist ein Beispiel dafür, wann unser aktuelles Programm nicht mehr funktionieren würde:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println(„Geben Sie die Nummer ein:“);

       int number = sc.nextInt();

       System.out.println(„Vielen Dank! Sie haben eine Nummer eingegeben.“ + number);

   }
}
Versuchen wir, die Zeichenfolge „JavaRush“ anstelle einer Zahl einzugeben: Konsolenausgabe:
Geben Sie die Nummer ein:
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
Hoppla, alles ist schlecht -_- Um solche Situationen zu vermeiden, müssen wir eine Möglichkeit finden, die vom Benutzer eingegebenen Daten zu validieren. Wenn der Benutzer beispielsweise etwas anderes als eine Zahl eingibt, wäre es schön, in der Konsole eine Warnung anzuzeigen, dass es sich bei den eingegebenen Informationen nicht um eine Zahl handelt, und wenn alles in Ordnung ist, einen Bestätigungstext anzuzeigen. Aber dazu müssen wir tatsächlich „in die Zukunft blicken“ – herausfinden, was als nächstes in unserem Fluss kommt. Kann der Scanner in Java dies tun? Wie kann er! Und dafür gibt es eine ganze Gruppe von Methoden: hasNextInt()- Die Methode prüft, ob der nächste Teil der eingegebenen Daten eine Zahl ist oder nicht (gibt true bzw. false zurück). hasNextLine()– prüft, ob das nächste Datenelement eine Zeichenfolge ist. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()– alle diese Methoden machen dasselbe für andere Datentypen. Versuchen wir, unser Programm so zu ändern, dass es Zahlen liest:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println(„Geben Sie die Nummer ein:“);

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println(„Vielen Dank! Sie haben eine Nummer eingegeben.“ + number);
       } else {
           System.out.println(„Tut mir leid, aber das ist eindeutig keine Zahl. Starten Sie das Programm neu und versuchen Sie es erneut!“);
       }

   }
}
Nun prüft unser Programm, ob das nächste eingegebene Zeichen eine Zahl ist oder nicht. Und nur wenn dies der Fall ist, wird eine Bestätigung angezeigt. Wenn die Eingabe den Test nicht besteht, bemerkt das Programm dies und fordert Sie auf, es erneut zu versuchen. Im Wesentlichen können Sie mit dem Scannerobjekt kommunizieren und im Voraus wissen , welche Art von Daten Sie erwarten können. „Hey, Scanner, was kommt als nächstes? Zahl, Zeichenfolge oder etwas anderes? Nummer? Und welches - int, short, long?" Diese Flexibilität gibt Ihnen die Möglichkeit, die Logik Ihres Programms abhängig vom Benutzerverhalten aufzubauen. Eine weitere wichtige Methode, die es wert ist, beachtet zu werden, ist useDelimiter(). Dieser Methode wird die Zeichenfolge übergeben, die Sie als Trennzeichen verwenden möchten. Beispielsweise interessierten wir uns plötzlich für japanische Poesie und beschlossen, mit dem Scanner mehrere Haiku des großen Dichters Matsuo Basho zu lesen. Selbst wenn uns drei verschiedene Verse in einer ungeschickten Zeile präsentiert werden, können wir sie leicht trennen und schön formatieren:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner(„Auf einem kahlen Ast“ +
               „Raven sitzt allein.“ +
               "Herbstabend." +
               "''***''" +
               „Da ist so ein Mond am Himmel“ +
               „Wie ein Baum, der an der Wurzel gefällt wird:‘“ +
               „Ein frischer Schnitt wird weiß.“ +
               "''***''" +
               „Wie der Fluss übergelaufen ist!“ +
               „Der Reiher wandert auf kurzen Beinen“ +
               „Knietief im Wasser.“);

       scan.useDelimiter("'");

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

       scan.close();
   }
}
Wir verwenden die Methode useDelimeter() der Klasse Scanner als Zeilentrenner : Sie ist für die Aufteilung der eingehenden Daten in Teile verantwortlich. In unserem Fall wird ein einfaches Anführungszeichen ( „'“ ) als Argument übergeben und zum Trennen von Zeichenfolgen verwendet . Der auf dieses Zitat folgende Text erscheint in einer neuen Zeile, da wir in der while-Schleife die println()- Methode der System- Klasse verwenden , um die Daten zu lesen. Als Ergebnis erhalten wir eine schöne Ausgabe in der Konsole, genau wie in den Büchern:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

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

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Im selben Beispiel gibt es noch eine weitere Methode, auf die Sie unbedingt achten sollten – close(). Wie jedes Objekt, das mit I/O-Streams arbeitet, sollte der Scanner geschlossen werden, wenn er seine Arbeit beendet hat, damit er nicht länger die Ressourcen unseres Computers verbraucht. Vergessen Sie niemals die Methode close()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println(„Geben Sie die Nummer ein:“);

       int number = sc.nextInt();

       System.out.println(„Vielen Dank! Sie haben eine Nummer eingegeben.“ + number);

       sc.close();//Jetzt haben wir alles richtig gemacht!

   }
}
Das ist alles! Wie Sie sehen, ist die Scanner-Klasse recht einfach zu verwenden und sehr nützlich! :) :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION