Consulter les notes de la classe java.util.Scanner

Aperçu

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

Comment créer une instance

À partir du fichier

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...
}

Depuis InputStream

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.

Depuis le chemin

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...
}

À partir de la chaîne

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...
}

De Readable

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...
}

Lire un fichier texte

** 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

Délimiteur de jeton

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

Confirmation du modèle utilisé pour la correspondance des délimiteurs

signature


public Pattern delimiter()

** Exemple de code **

example


scanner.delimiter().pattern();

Résultat de sortie

output


\p{javaWhitespace}+

Spécifie le modèle à utiliser pour la correspondance des délimiteurs

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]

Lire ligne par ligne à partir d'un fichier texte

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

Lire à partir d'un fichier texte en unités de jeton

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

Utilisation combinée de next et nextLine

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"

Rechercher des modèles avec findInLine

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

API ajoutée dans Java 9

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"]

API ajoutée dans Java 10

Nouveau constructeur

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)

Autres notes d'examen

Recommended Posts

Consulter les notes de la classe java.util.Scanner
Consultez les notes de la classe java.util.Optional
Une note de révision pour la classe java.util.Objects
Consulter les notes du package java.time.temporal
Une note sur la classe Utils libGDX
Remarques sur la portée
Remarque sur l'initialisation des champs dans le didacticiel Java
Une note de révision de l'interface Spring Framework Resource
Un murmure sur la classe utilitaire
Notes pour ceux qui vivent avec JMockit
Une note lorsque la commande heroku devient indisponible
Un examen rapide de Java appris en classe
Un mémo sur le flux de Rails et Vue
Résoudre le problème de l'accès aléatoire lent pour linkedList, une classe de type collection
[Pour les débutants] Où vérifier lorsqu'une classe est introuvable au moment de la compilation
Une revue du code utilisé par les rails débutants
J'ai créé un outil de vérification pour le module de version
Un examen rapide de Java appris en classe part4
J'ai lu le code lisible, alors prends note
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
Comment faire un MOD pour Slay the Spire
À propos de la classe StringBuilder
Note n ° 6 "Calculez la formule de la différence de somme à un chiffre reçue sous forme de chaîne de caractères" [Java]
Examen de la classe interne Java
Classe imbriquée (pour moi)
SDWebImage: Comment vider le cache pour une UIImageView particulière
Une note sur la fonction de départ de Ruby on Rails
J'ai essayé JAX-RS et pris note de la procédure
Je veux donner un nom de classe à l'attribut select
J'ai étudié Randoop, un générateur de classe de test JUnit pour Java.
Un mémorandum pour atteindre le lieu qui démange pour Java Gold
Viser une compréhension de base du flux de traitement récursif
Un examen de 25 jours et les efforts futurs pour Keycloak de NRI Open Standia
Avec le logiciel que je fais depuis longtemps ...
Modéliser Digimon avec DDD pour la première fois Partie 1