Überprüfen Sie die Notizen für die Klasse java.util.Scanner

Überblick

Dies ist eine Übersicht über die aus Java 1.5 eingeführte Klasse java.util.Scanner. Es gibt viele Beispiele für die Verwendung der Standardeingabe (System.in) in den Verwendungsbeispielen der Scannerklasse. Dieser Artikel konzentriert sich jedoch auf das Lesen von Textdateien ohne Standardeingabe. Es werden auch nicht alle APIs der Scannerklasse behandelt.

Umgebung

Referenz

So erstellen Sie eine Instanz

Aus Datei

signature


public Scanner​(File source) throws FileNotFoundException

public Scanner​(File source, String charsetName) throws FileNotFoundException

** Codebeispiel **

example


Path in = Paths.get("path/to/sample.in");
Scanner scanner = new Scanner(in.toFile());
try (scanner) {
  // ...Kürzung...
}

Von InputStream

signature


public Scanner​(InputStream source)

public Scanner​(InputStream source, String charsetName)

** Codebeispiel **

example


InputStream in = Files.newInputStream(Paths.get("path/to/sample.in"));
Scanner scanner = new Scanner(in);
try (scanner) {
  // ...Kürzung...
}

Wie in JavaDoc beschrieben, wird diese Ressource auch geschlossen, wenn die Eingaberessource des Scanners die Schnittstelle Closeable implementiert, und muss beim Schließen des Scanners ebenfalls geschlossen werden und muss nicht in die try-Klausel aufgenommen werden.

Wenn der Scanner geschlossen ist und seine Eingangsquelle die Closeable-Schnittstelle implementiert, wird diese Quelle ebenfalls geschlossen.

Vom Pfad

signature


public Scanner​(Path source) throws IOException

public Scanner​(Path source, String charsetName) throws IOException

** Codebeispiel **

example


Path in = Paths.get("path", "to", "sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
  // ...Kürzung...
}

Von String

signature


public Scanner​(String source)

** Codebeispiel **

example


String in = "apple banana cherry durian elderberry";
Scanner scanner = new Scanner(in);
try (scanner) {
  // ...Kürzung...
}

Von Lesbar

signature


public Scanner​(Readable source)

** Codebeispiel **

example


Readable in = new FileReader(new File("path/to/sample.in"));
Scanner scanner = new Scanner(in);
try (scanner) {
  // ...Kürzung...
}

Lesen Sie eine Textdatei

** Beispieldatei **

Ich habe die Postleitzahldaten verwendet, die von der Website von Nippon Post Co., Ltd. heruntergeladen werden können. Die Codebeispiele in diesem Artikel befassen sich mit diesem durch Kommas getrennten Text. In der Regel verwenden Sie jedoch eine Bibliothek wie opencsv.

sample.in


32343,"69917","6991701","Shimanen","Nitagun Oquiz Mocho","Kameda","Präfektur Shimane","Oku Izumo-cho, Nita-gun","Schildkröte",0,0,0,0,0,0
32343,"69915","6991515","Shimanen","Nitagun Oquiz Mocho","Kamokura","Präfektur Shimane","Oku Izumo-cho, Nita-gun","Kamokura",0,0,0,0,0,0
32343,"69915","6991514","Shimanen","Nitagun Oquiz Mocho","Kawachi","Präfektur Shimane","Oku Izumo-cho, Nita-gun","Kawachi",0,0,0,0,0,0

Token-Trennzeichen

Das Standard-Token-Trennzeichen ist ein Leerzeichen. In diesem Fall ist das Leerzeichen jedoch gemäß Java-Standards ein Leerzeichen (Zeichen, das Character.isWhitespace als true zurückgibt). Zusätzlich zu Leerzeichen mit halber Breite werden beispielsweise die folgenden Zeichen als Trennzeichen erkannt.

** Ausgabeergebnis **

Zeichen mit einem echten Rückgabewert sind Java-basierte Leerzeichen.

output


Character.isWhitespace(' ');       //Raum halber Breite
// → true
Character.isWhitespace('\u0020');  //Raum halber Breite
// → true
Character.isWhitespace(' ');      //Raum in voller Breite
// → true
Character.isWhitespace('\t');      //Tab
// → true
Character.isWhitespace('\n');      //Neue Zeile
// → true
Character.isWhitespace('\f');      //Formularvorschub
// → true
Character.isWhitespace('\r');      //Rückkehr
// → true
Character.isWhitespace('\u001C');  //Dateibegrenzer
// → true
Character.isWhitespace('\u001D');  //Gruppenbegrenzer
// → true
Character.isWhitespace('\u001E');  //Datensatztrennzeichen
// → true
Character.isWhitespace('\u001F');  //Einheitenbegrenzer
// → true

Character.isWhitespace('\u00a0');  //Kein Pausenraum.Sogenannt 
// → false
Character.isWhitespace('a');
// → false
Character.isWhitespace('Ah');
// → false

Bestätigung des für die Trennzeichenübereinstimmung verwendeten Musters

signature


public Pattern delimiter()

** Codebeispiel **

example


scanner.delimiter().pattern();

Ausgabeergebnis

output


\p{javaWhitespace}+

Gibt das Muster an, das für den Trennzeichenabgleich verwendet werden soll

Geben Sie mit der useDelimiter-Methode ein beliebiges Muster für das Trennzeichen an.

signature


public Scanner useDelimiter​(Pattern pattern)

public Scanner useDelimiter​(String pattern)

** Codebeispiel **

example


String in = "apple :  banana   : cherry  : durian  :  elderberry";
Scanner scanner = new Scanner(in);
try (scanner) {
  scanner.useDelimiter("\\s*:\\s*");
  while (scanner.hasNext()) {
    System.out.println("[" + scanner.next() + "]");
  }
}

Ausgabeergebnis

output


[apple]
[banana]
[cherry]
[durian]
[elderberry]

Zeile für Zeile aus der Textdatei lesen

Verwenden Sie die Methoden hasNextLine und nextLine. Die hasNextLine-Methode gibt true zurück, wenn der Scanner noch Eingabezeilen hat. Die nextLine-Methode gibt auch den Inhalt von der aktuellen Position des Scanners bis zum Ende der Zeile zurück und verschiebt die Position des Scanners an den Anfang der nächsten Zeile.

signature


public boolean hasNextLine()

public String nextLine()

** Codebeispiel **

example


File in = new File("path/to/sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
  int counter = 0;
  while (scanner.hasNextLine()) {
    System.out.println(String.format("%2d: %s", ++counter, scanner.nextLine()));
  }
}

Ausgabeergebnis

output


 1: 32343,"69917","6991701","Shimanen","Nitagun Oquiz Mocho","Kameda","Präfektur Shimane","Oku Izumo-cho, Nita-gun","Schildkröte",0,0,0,0,0,0
 2: 32343,"69915","6991515","Shimanen","Nitagun Oquiz Mocho","Kamokura","Präfektur Shimane","Oku Izumo-cho, Nita-gun","Kamokura",0,0,0,0,0,0
 3: 32343,"69915","6991514","Shimanen","Nitagun Oquiz Mocho","Kawachi","Präfektur Shimane","Oku Izumo-cho, Nita-gun","Kawachi",0,0,0,0,0,0

Lesen Sie aus der Textdatei in Token-Einheiten

Die hasNext-Methode gibt true zurück, wenn die Scannereingabe ein anderes Token enthält. Die nächste Methode gibt auch ein Token von der aktuellen Position des Scanners zurück und verschiebt die Position des Scanners an die Position des nächsten Trennzeichens.

Das Standard-Token-Trennzeichen ist Leerzeichen (halbe Breite, volle Breite), Tabulator, Zeilenvorschubcode usw. In diesen Beispieldaten ist das Token-Trennzeichen jedoch ein Komma. Geben Sie es daher explizit mit der useDelimiter-Methode an, und der Zeilenvorschubcode ist auch das Token-Trennzeichen. Muss als Zeichen angegeben werden.

signature


public boolean hasNext()

public String next()

** Codebeispiel **

example


File in = new File("path/to/sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
  scanner.useDelimiter(",|\n");
  int counter = 0;
  while (scanner.hasNext()) {
    System.out.println(String.format("%2d: %s", ++counter, scanner.next()));
  }
}

Ausgabeergebnis

output


 1: 32343
 2: "69917"
 3: "6991701"
 4: "Shimanen"
 5: "Nitagun Oquiz Mocho"
 6: "Kameda"
 7: "Präfektur Shimane"
 8: "Oku Izumo-cho, Nita-gun"
 9: "Schildkröte"
10: 0
11: 0
12: 0
13: 0
14: 0
15: 0
16: 32343
17: "69915"
18: "6991515"
19: "Shimanen"
20: "Nitagun Oquiz Mocho"
21: "Kamokura"
22: "Präfektur Shimane"
23: "Oku Izumo-cho, Nita-gun"
24: "Kamokura"
25: 0
26: 0
27: 0
28: 0
29: 0
30: 0
31: 32343
32: "69915"
33: "6991514"
34: "Shimanen"
35: "Nitagun Oquiz Mocho"
36: "Kawachi"
37: "Präfektur Shimane"
38: "Oku Izumo-cho, Nita-gun"
39: "Kawachi"
40: 0
41: 0
42: 0
43: 0
44: 0
45: 0

Kombinierte Verwendung von next und nextLine

Sie können auch die nächste Methode verwenden, um das Token an einer beliebigen Position zu lesen, und die nextLine-Methode, um die Daten bis zum Ende der Zeile zu überspringen.

** Codebeispiel **

example


File in = new File("path/to/sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
  scanner.useDelimiter(",");
  int counter = 0;
  while (scanner.hasNextLine()) {
    int code = scanner.nextInt();        //Nationaler lokaler Regierungskodex
    String zip5 = scanner.next();        //Postleitzahl (5 Ziffern)
    String zip7 = scanner.next();        //Postleitzahl (7 Ziffern)
    scanner.next();                      //Name der Präfektur überspringen Halbe Breite Katakana
    scanner.next();                      //überspringen Städtischer Name Halbe Breite Katakana
    scanner.next();                      //überspringen Stadtgebietsname Halbe Breite Katakana
    String prefectures = scanner.next(); //Name der Präfekturen
    String city = scanner.next();        //Stadtname
    String townArea = scanner.next();    //Name des Stadtgebiets
    System.out.println(String.format("%2d: %d %s %s %s %s %s", ++counter, code, zip5, zip7, prefectures, city, townArea));
    scanner.nextLine();                  // next line
  }
}

Ausgabeergebnis

output


 1: 32343 "69917" "6991701" "Präfektur Shimane" "Oku Izumo-cho, Nita-gun" "Schildkröte"
 2: 32343 "69915" "6991515" "Präfektur Shimane" "Oku Izumo-cho, Nita-gun" "Kamokura"
 3: 32343 "69915" "6991514" "Präfektur Shimane" "Oku Izumo-cho, Nita-gun" "Kawachi"

Suchen Sie mit findInLine nach Mustern

Sucht nach einer Zeichenfolge, die dem in der findInLine-Methode angegebenen Suchmuster von der aktuellen Position des Scanners bis zum Zeilenende entspricht. Gibt null zurück, wenn keine Zeichenfolge gefunden wird, die dem Muster entspricht.

signature


public String findInLine​(String pattern)

public String findInLine​(Pattern pattern)

** Codebeispiel **

exmaple


File in = new File("path/to/sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
  int counter = 0;
  while (scanner.hasNextLine()) {
    String find = scanner.findInLine("69915[0-9]{2}");
    System.out.println(String.format("%2d: %s", ++counter, find));
    scanner.nextLine(); // next line
  }
}

Ausgabeergebnis

output


 1: null
 2: 6991515
 3: 6991514

API in Java 9 hinzugefügt

tokens

Gibt einen Stream von Token zurück.

signature


public Stream<String> tokens()

** Codebeispiel **

example


String in = "apple banana cherry durian elderberry";
Scanner scanner = new Scanner(in);
try (scanner) {
  final List<String> fruits = scanner.tokens()
    .map(String::toUpperCase)
    .collect(Collectors.toUnmodifiableList());
  System.out.println(fruits);
}

Ausgabeergebnis

output


[APPLE, BANANA, CHERRY, DURIAN, ELDERBERRY]

findAll

Gibt einen Stream von Musterübereinstimmungen vom Scanner zurück.

signature


public Stream<MatchResult> findAll​(Pattern pattern)

public Stream<MatchResult> findAll​(String patString)

** Codebeispiel **

example


File in = new File("path/to/sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
  List<String> list = scanner.findAll("\"[0-9]{5,}\"")
    .map(MatchResult::group)
    .collect(Collectors.toUnmodifiableList());
  System.out.println(list);
}

Ausgabeergebnis

output


["69917", "6991701", "69915", "6991515", "69915", "6991514"]

API in Java 10 hinzugefügt

Neuer Konstruktor

Es wurde ein neuer Konstruktor hinzugefügt, der Charset als zweites Argument verwendet. Das Codebeispiel wird weggelassen.

signature


public Scanner​(InputStream source, Charset charset)

public Scanner​(File source, Charset charset) throws IOException

public Scanner​(Path source, Charset charset) throws IOException

public Scanner​(ReadableByteChannel source, Charset charset)

Andere Überprüfungsnotizen

Recommended Posts

Überprüfen Sie die Notizen für die Klasse java.util.Scanner
Überprüfen Sie die Notizen für die Klasse java.util.Optional
Ein Überprüfungshinweis für die Klasse java.util.Objects
Überprüfen Sie die Notizen für das Paket java.time.temporal
Ein Hinweis zur libGDX Utils-Klasse
Hinweise zum Umfang
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Eine Übersicht über die Spring Framework Resource-Oberfläche
Ein Murmeln über die Utility-Klasse
Hinweise für diejenigen, die mit JMockit leben
Ein Hinweis, wenn der Heroku-Befehl nicht mehr verfügbar ist
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Ein Memo über den Fluss von Rails und Vue
Behebung des Problems des langsamen Direktzugriffs für linkedList, eine Auflistungstypklasse
[Für Anfänger] Wo kann überprüft werden, wann eine Klasse zur Kompilierungszeit nicht gefunden werden kann?
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
Ich habe ein Check-Tool für das Release-Modul erstellt
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Ich habe den lesbaren Code gelesen, machen Sie sich also eine Notiz
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Wie erstelle ich einen MOD für Slay the Spire?
Informationen zur StringBuilder-Klasse
Anmerkung Nr. 6 "Berechnen Sie die Formel für die als Zeichenfolge empfangene einstellige Summendifferenz" [Java]
Überprüfung der Java-Innenklasse
Verschachtelte Klasse (für mich)
SDWebImage: So löschen Sie den Cache für eine bestimmte UIImageView
Ein Hinweis zum Seed-Feature von Ruby on Rails
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich möchte dem select-Attribut einen Klassennamen geben
Ich habe Randoop untersucht, einen JUnit-Testklassengenerator für Java.
Ein Memorandum, um den juckenden Ort für Java Gold zu erreichen
Ein grundlegendes Verständnis des Flusses der rekursiven Verarbeitung anstreben
Eine 25-tägige Überprüfung und zukünftige Bemühungen für NRI Open Standias Schlüsselumhang
Mit der Software, die ich schon lange mache ...
Erstmaliges Modellieren von Digimon mit DDD Teil 1