Scanner Java

1. Présentation du scanner

Dans ce rapide didacticiel, nous illustrerons comment utiliser la classe Java Scanner - pour lire les entrées, rechercher et ignorer des modèles avec différents délimiteurs.

2. Analyser un fichier

Tout d'abord, voyons comment lire un fichier à l'aide de Scanner .

Dans l'exemple suivant, nous lisons un fichier contenant « Hello world » en jetons:

@Test public void whenReadFileWithScanner_thenCorrect() throws IOException{ Scanner scanner = new Scanner(new File("test.txt")); assertTrue(scanner.hasNext()); assertEquals("Hello", scanner.next()); assertEquals("world", scanner.next()); scanner.close(); }

Notez que la méthode next () renvoie ici le jeton String suivant .

Notez également comment nous fermons le scanner lorsque nous avons fini de l'utiliser.

3. Convertissez InputStream en chaîne

Ensuite, voyons comment convertir un InputStream en chaîne à l' aide d'un scanner :

@Test public void whenConvertInputStreamToString_thenConverted() throws IOException { String expectedValue = "Hello world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.useDelimiter("A"); String result = scanner.next(); assertEquals(expectedValue, result); scanner.close(); }

Semblable à l'exemple précédent, nous avons utilisé le Scanner pour tokeniser le flux entier du début à la prochaine expression régulière «A» - qui correspond à l'entrée complète.

4. Scanner vs BufferedReader

Maintenant - discutons de la différence entre Scanner et BufferedReader - nous utilisons généralement:

  • BufferedReader lorsque nous voulons lire l'entrée en lignes
  • Scanner pour lire l'entrée en jetons

Dans l'exemple suivant, nous lisons un fichier en lignes à l'aide de BufferedReader :

@Test public void whenReadUsingBufferedReader_thenCorrect() throws IOException { String firstLine = "Hello world"; String secondLine = "Hi, John"; BufferedReader reader = new BufferedReader(new FileReader("test.txt")); String result = reader.readLine(); assertEquals(firstLine, result); result = reader.readLine(); assertEquals(secondLine, result); reader.close(); }

Maintenant, utilisons Scanner pour lire le même fichier en jetons:

@Test public void whenReadUsingScanner_thenCorrect() throws IOException { String firstLine = "Hello world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.nextLine(); assertEquals(firstLine, result); scanner.useDelimiter(", "); assertEquals("Hi", scanner.next()); assertEquals("John", scanner.next()); scanner.close(); }

Notez comment nous utilisons l' API Scanner nextLine () - pour lire la ligne entière .

5. Scanner l'entrée depuis la console à l'aide du nouveau scanner (System.in)

Ensuite, voyons comment lire l'entrée de la console à l'aide d'une instance de Scanner :

@Test public void whenReadingInputFromConsole_thenCorrect() { String input = "Hello"; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(input.getBytes())); Scanner scanner = new Scanner(System.in); String result = scanner.next(); assertEquals(input, result); System.setIn(stdin); scanner.close(); }

Notez que nous avons utilisé System.setIn (…) pour simuler certaines entrées provenant de la console.

5.1. API nextLine ()

Cette méthode renvoie simplement la chaîne à la ligne courante:

scanner.nextLine();

Cela lit le contenu de la ligne actuelle et le renvoie à l'exception de tout séparateur de ligne à la fin - dans ce cas - le caractère de nouvelle ligne.

Après avoir lu le contenu, le scanner définit sa position au début de la ligne suivante. Le point important à retenir est que l' API nextLine () consomme le séparateur de ligne et déplace la position du scanner vers la ligne suivante .

Donc, la prochaine fois que nous lirons Scanner, nous lirons à partir du début de la ligne suivante.

5.2. API nextInt ()

Cette méthode analyse le jeton suivant de l'entrée comme un int:

scanner.nextInt();

L'API lit ensuite le jeton entier disponible.

Dans ce cas, si le jeton suivant est un entier et après l'entier, il y a un séparateur de ligne, rappelez-vous toujours que nextInt () ne consommera pas le séparateur de ligne. Au lieu de cela, la position du scanner sera le séparateur de ligne lui-même .

Donc, si nous avons une série d'opérations, où la première opération est un scanner.nextInt () puis scanner.nextLine () et comme entrée si nous fournissons un entier et appuyez sur le saut de ligne, les deux opérations seront exécutées.

L' API nextInt () consommera l'entier et l' API nextLine () consommera le séparateur de ligne et placera Scanner au début de la ligne suivante.

6. Valider l'entrée

Voyons maintenant comment valider l'entrée à l'aide d'un scanner . Dans l'exemple suivant, nous utilisons la méthode Scanner hasNextInt () pour vérifier si l'entrée est une valeur entière:

@Test public void whenValidateInputUsingScanner_thenValidated() throws IOException { String input = "2000"; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(input.getBytes())); Scanner scanner = new Scanner(System.in); boolean isIntInput = scanner.hasNextInt(); assertTrue(isIntInput); System.setIn(stdin); scanner.close(); }

7. Scanner une chaîne

Ensuite, voyons comment analyser une chaîne à l' aide de Scanner :

@Test public void whenScanString_thenCorrect() throws IOException { String input = "Hello 1 F 3.5"; Scanner scanner = new Scanner(input); assertEquals("Hello", scanner.next()); assertEquals(1, scanner.nextInt()); assertEquals(15, scanner.nextInt(16)); assertEquals(3.5, scanner.nextDouble(), 0.00000001); scanner.close(); }

Remarque: La méthode nextInt (16) lit le jeton suivant sous la forme d'une valeur entière hexadécimale.

8. Rechercher un motif

Voyons maintenant comment trouver un motif à l' aide du scanner .

Dans l'exemple suivant, nous utilisons findInLine () pour rechercher un jeton qui correspond au modèle donné dans toute l'entrée:

@Test public void whenFindPatternUsingScanner_thenFound() throws IOException { String expectedValue = "world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.findInLine("wo..d"); assertEquals(expectedValue, result); scanner.close(); }

We can also search for a Pattern in the specific domain using findWithinHorizon() as in the following example:

@Test public void whenFindPatternInHorizon_thenFound() throws IOException { String expectedValue = "world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.findWithinHorizon("wo..d", 5); assertNull(result); result = scanner.findWithinHorizon("wo..d", 100); assertEquals(expectedValue, result); scanner.close(); }

Note that the search horizon is simply the number of characters within which the search is performed.

9. Skip Pattern

Next – let's see how to skip a Pattern in Scanner. We can skip tokens that match a specific pattern while reading the input using Scanner.

In the following example – we skip “Hello” token using the Scanner method skip():

@Test public void whenSkipPatternUsingScanner_thenSkipped() throws IOException { FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.skip(".e.lo"); assertEquals("world", scanner.next()); scanner.close(); }

10. Change Scanner Delimiter

Finally – let's see how to change the Scanner delimiter. In the following example – we change the default Scanner delimiter to “o“:

@Test public void whenChangeScannerDelimiter_thenChanged() throws IOException { String expectedValue = "Hello world"; String[] splited = expectedValue.split("o"); FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.useDelimiter("o"); assertEquals(splited[0], scanner.next()); assertEquals(splited[1], scanner.next()); assertEquals(splited[2], scanner.next()); scanner.close(); }

We can also use multiple delimiters. In the following example – we use both commas “,” and dash”” as delimiters to scan a file contains “John,Adam-Tom“:

@Test public void whenReadWithScannerTwoDelimiters_thenCorrect() throws IOException -"); assertEquals("John", scanner.next()); assertEquals("Adam", scanner.next()); assertEquals("Tom", scanner.next()); scanner.close(); 

Note: The default Scanner delimiter is whitespace.

11. Conclusion

In this tutorial, we went over multiple real-world examples of using the Java Scanner.

Nous avons appris à lire les entrées d'un fichier, d'une console ou d'une chaîne à l' aide du scanner ; nous avons également appris comment rechercher et ignorer un motif à l'aide de Scanner - ainsi que comment modifier le délimiteur du scanner .

L'implémentation de ces exemples est disponible à l'adresse over sur GitHub.