Ceci est une note de révision de la classe java.util.Scanner introduite à partir de Java 1.5. Il existe de nombreux exemples d'utilisation de l'entrée standard (System.in) dans les exemples d'utilisation de la classe Scanner, mais cet article se concentre sur la lecture de fichiers texte sans traiter l'entrée standard. Il ne couvre pas non plus toutes les API de la classe Scanner.
environnement
référence
signature
public Scanner(File source) throws FileNotFoundException
public Scanner(File source, String charsetName) throws FileNotFoundException
** Exemple de code **
example
Path in = Paths.get("path/to/sample.in");
Scanner scanner = new Scanner(in.toFile());
try (scanner) {
// ...réduction...
}
signature
public Scanner(InputStream source)
public Scanner(InputStream source, String charsetName)
** Exemple de code **
example
InputStream in = Files.newInputStream(Paths.get("path/to/sample.in"));
Scanner scanner = new Scanner(in);
try (scanner) {
// ...réduction...
}
Comme décrit dans JavaDoc, si la ressource d'entrée du Scanner implémente l'interface Closeable, lorsque le Scanner est fermé, cette ressource est également fermée et n'a pas besoin d'être incluse dans la clause try.
Lorsque le Scanner est fermé, si sa source d'entrée implémente l'interface Closeable, cette source sera également fermée.
signature
public Scanner(Path source) throws IOException
public Scanner(Path source, String charsetName) throws IOException
** Exemple de code **
example
Path in = Paths.get("path", "to", "sample.in");
Scanner scanner = new Scanner(in);
try (scanner) {
// ...réduction...
}
signature
public Scanner(String source)
** Exemple de code **
example
String in = "apple banana cherry durian elderberry";
Scanner scanner = new Scanner(in);
try (scanner) {
// ...réduction...
}
signature
public Scanner(Readable source)
** Exemple de code **
example
Readable in = new FileReader(new File("path/to/sample.in"));
Scanner scanner = new Scanner(in);
try (scanner) {
// ...réduction...
}
** Exemple de fichier **
J'ai utilisé les données de code postal qui peuvent être téléchargées à partir du site Web de Nippon Post Co., Ltd. Les exemples de code de cet article traitent de ce texte séparé par des virgules, mais vous utiliserez généralement une bibliothèque telle que opencsv.
sample.in
32343,"69917","6991701","Shimanen","Nitagun Oquiz Mocho","Kameda","Préfecture de Shimane","Oku Izumo-cho, Nita-gun","Tortue",0,0,0,0,0,0
32343,"69915","6991515","Shimanen","Nitagun Oquiz Mocho","Kamokura","Préfecture de Shimane","Oku Izumo-cho, Nita-gun","Kamokura",0,0,0,0,0,0
32343,"69915","6991514","Shimanen","Nitagun Oquiz Mocho","Kawachi","Préfecture de Shimane","Oku Izumo-cho, Nita-gun","Kawachi",0,0,0,0,0,0
Le délimiteur de jeton par défaut est un caractère vide. Cependant, le caractère vide dans ce cas est un blanc selon les normes Java (caractère que Character.isWhitespace renvoie true), et en plus des espaces demi-largeur, par exemple, les éléments suivants sont reconnus comme des délimiteurs.
** Résultat de sortie **
Les caractères avec une valeur de retour vraie sont des espaces basés sur Java.
output
Character.isWhitespace(' '); //Espace demi-largeur
// → true
Character.isWhitespace('\u0020'); //Espace demi-largeur
// → true
Character.isWhitespace(' '); //Espace pleine largeur
// → true
Character.isWhitespace('\t'); //languette
// → true
Character.isWhitespace('\n'); //nouvelle ligne
// → true
Character.isWhitespace('\f'); //Saut de formulaire
// → true
Character.isWhitespace('\r'); //revenir
// → true
Character.isWhitespace('\u001C'); //Délimiteur de fichier
// → true
Character.isWhitespace('\u001D'); //Délimiteur de groupe
// → true
Character.isWhitespace('\u001E'); //Délimiteur d'enregistrement
// → true
Character.isWhitespace('\u001F'); //Délimiteur d'unité
// → true
Character.isWhitespace('\u00a0'); //Pas d'espace de pause.Soi-disant
// → false
Character.isWhitespace('a');
// → false
Character.isWhitespace('Ah');
// → false
signature
public Pattern delimiter()
** Exemple de code **
example
scanner.delimiter().pattern();
Résultat de sortie
output
\p{javaWhitespace}+
Spécifiez un modèle arbitraire pour le délimiteur avec la méthode useDelimiter.
signature
public Scanner useDelimiter(Pattern pattern)
public Scanner useDelimiter(String pattern)
** Exemple de code **
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() + "]");
}
}
Résultat de sortie
output
[apple]
[banana]
[cherry]
[durian]
[elderberry]
Utilisez les méthodes hasNextLine et nextLine. La méthode hasNextLine renvoie true si l'analyseur a encore des lignes d'entrée. La méthode nextLine renvoie également le contenu de la position actuelle du scanner à la fin de la ligne et déplace la position du scanner au début de la ligne suivante.
signature
public boolean hasNextLine()
public String nextLine()
** Exemple de code **
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()));
}
}
Résultat de sortie
output
1: 32343,"69917","6991701","Shimanen","Nitagun Oquiz Mocho","Kameda","Préfecture de Shimane","Oku Izumo-cho, Nita-gun","Tortue",0,0,0,0,0,0
2: 32343,"69915","6991515","Shimanen","Nitagun Oquiz Mocho","Kamokura","Préfecture de Shimane","Oku Izumo-cho, Nita-gun","Kamokura",0,0,0,0,0,0
3: 32343,"69915","6991514","Shimanen","Nitagun Oquiz Mocho","Kawachi","Préfecture de Shimane","Oku Izumo-cho, Nita-gun","Kawachi",0,0,0,0,0,0
La méthode hasNext renvoie true si l'entrée de l'analyseur a un autre jeton. La méthode suivante renvoie également un jeton à partir de la position actuelle du scanner et déplace la position du scanner vers la position du séparateur suivant.
Le délimiteur de jeton par défaut est un espace blanc (demi-largeur, pleine largeur), une tabulation, un code de saut de ligne, etc., mais dans cet exemple de données, le séparateur de jeton est une virgule, spécifiez-le donc explicitement avec la méthode useDelimiter, et le code de saut de ligne est également le délimiteur de jeton. Doit être spécifié comme caractère.
signature
public boolean hasNext()
public String next()
** Exemple de code **
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()));
}
}
Résultat de sortie
output
1: 32343
2: "69917"
3: "6991701"
4: "Shimanen"
5: "Nitagun Oquiz Mocho"
6: "Kameda"
7: "Préfecture de Shimane"
8: "Oku Izumo-cho, Nita-gun"
9: "Tortue"
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éfecture de 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éfecture de Shimane"
38: "Oku Izumo-cho, Nita-gun"
39: "Kawachi"
40: 0
41: 0
42: 0
43: 0
44: 0
45: 0
Vous pouvez également utiliser la méthode suivante pour lire le jeton à n'importe quelle position et la méthode nextLine pour ignorer les données jusqu'à la fin de la ligne.
** Exemple de code **
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(); //Code national des collectivités locales
String zip5 = scanner.next(); //Code postal (5 chiffres)
String zip7 = scanner.next(); //Code postal (7 chiffres)
scanner.next(); //ignorer le nom de la préfecture Katakana demi-largeur
scanner.next(); //sauter Nom municipal Katakana demi-largeur
scanner.next(); //sauter Nom de la zone de ville Katakana demi-largeur
String prefectures = scanner.next(); //Nom des préfectures
String city = scanner.next(); //Nom de Ville
String townArea = scanner.next(); //Nom de la zone de la ville
System.out.println(String.format("%2d: %d %s %s %s %s %s", ++counter, code, zip5, zip7, prefectures, city, townArea));
scanner.nextLine(); // next line
}
}
Résultat de sortie
output
1: 32343 "69917" "6991701" "Préfecture de Shimane" "Oku Izumo-cho, Nita-gun" "Tortue"
2: 32343 "69915" "6991515" "Préfecture de Shimane" "Oku Izumo-cho, Nita-gun" "Kamokura"
3: 32343 "69915" "6991514" "Préfecture de Shimane" "Oku Izumo-cho, Nita-gun" "Kawachi"
Recherche une chaîne de caractères correspondant au modèle de recherche spécifié dans la méthode findInLine de la position actuelle du scanner à la fin de la ligne. Renvoie null si aucune chaîne correspondant au modèle n'est trouvée.
signature
public String findInLine(String pattern)
public String findInLine(Pattern pattern)
** Exemple de code **
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
}
}
Résultat de sortie
output
1: null
2: 6991515
3: 6991514
tokens
Renvoie un flux de jetons.
signature
public Stream<String> tokens()
** Exemple de code **
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);
}
Résultat de sortie
output
[APPLE, BANANA, CHERRY, DURIAN, ELDERBERRY]
findAll
Renvoie un flux de correspondances de motifs à partir du scanner.
signature
public Stream<MatchResult> findAll(Pattern pattern)
public Stream<MatchResult> findAll(String patString)
** Exemple de code **
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);
}
Résultat de sortie
output
["69917", "6991701", "69915", "6991515", "69915", "6991514"]
Un nouveau constructeur a été ajouté qui prend Charset comme deuxième argument. L'exemple de code est omis.
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