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
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...
}
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.
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...
}
signature
public Scanner(String source)
** Codebeispiel **
example
String in = "apple banana cherry durian elderberry";
Scanner scanner = new Scanner(in);
try (scanner) {
// ...Kürzung...
}
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...
}
** 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
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
signature
public Pattern delimiter()
** Codebeispiel **
example
scanner.delimiter().pattern();
Ausgabeergebnis
output
\p{javaWhitespace}+
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]
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
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
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"
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
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"]
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)
Recommended Posts