Java Scanner

1. Übersicht über den Scanner

In diesem kurzen Tutorial zeigen wir Ihnen, wie Sie die Java Scanner- Klasse verwenden - um Eingaben zu lesen, Muster mit verschiedenen Trennzeichen zu finden und zu überspringen.

2. Scannen Sie eine Datei

Lassen Sie uns zunächst sehen, wie Sie eine Datei mit dem Scanner lesen .

Im folgenden Beispiel lesen wir eine Datei, die " Hallo Welt " in Token enthält:

@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(); }

Beachten Sie, dass die next () -Methode hier das nächste String- Token zurückgibt .

Beachten Sie auch, wie wir den Scanner schließen, wenn wir ihn nicht mehr verwenden.

3. Konvertieren Sie InputStream in String

Weiter - sehen wir uns an, wie Sie einen InputStream mithilfe eines Scanners in einen String konvertieren :

@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(); }

Ähnlich wie im vorherigen Beispiel haben wir den Scanner verwendet, um den gesamten Stream vom Anfang bis zur nächsten Regex "A" zu token - was der vollständigen Eingabe entspricht.

4. Scanner vs. BufferedReader

Nun - lassen Sie uns den Unterschied zwischen Scanner und BufferedReader diskutieren - verwenden wir im Allgemeinen:

  • BufferedReader, wenn wir die Eingabe in Zeilen lesen möchten
  • Scanner zum Einlesen der Eingabe in Token

Im folgenden Beispiel lesen wir eine Datei mit BufferedReader in Zeilen :

@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(); }

Verwenden wir nun den Scanner , um dieselbe Datei in Token einzulesen:

@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(); }

Beachten Sie, wie wir die Scanner nextLine () API verwenden , um die gesamte Zeile zu lesen .

5. Scannen Sie die Eingabe von der Konsole mit einem neuen Scanner (System.in).

Weiter - sehen wir uns an, wie Sie Eingaben von der Konsole mithilfe einer Scannerinstanz lesen :

@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(); }

Beachten Sie, dass wir System.setIn (…) verwendet haben , um einige Eingaben von der Konsole zu simulieren.

5.1. nextLine () API

Diese Methode gibt einfach die Zeichenfolge in der aktuellen Zeile zurück:

scanner.nextLine();

Dies liest den Inhalt der aktuellen Zeile und gibt ihn zurück, mit Ausnahme eines Zeilentrennzeichens am Ende - in diesem Fall - des neuen Zeilenzeichens.

Nach dem Lesen des Inhalts setzt der Scanner seine Position auf den Anfang der nächsten Zeile. Der wichtige Punkt, den Sie beachten sollten, ist, dass die nextLine () -API das Zeilentrennzeichen verwendet und die Position des Scanners in die nächste Zeile verschiebt .

Wenn wir also das nächste Mal den Scanner durchlesen, lesen wir vom Anfang der nächsten Zeile an.

5.2. nextInt () API

Diese Methode scannt das nächste Token der Eingabe als int:

scanner.nextInt();

Die API liest das als nächstes verfügbare Integer-Token.

Wenn in diesem Fall das nächste Token eine Ganzzahl ist und nach der Ganzzahl ein Zeilentrennzeichen steht, denken Sie immer daran, dass nextInt () das Zeilentrennzeichen nicht verwendet. Stattdessen ist die Position des Scanners das Zeilentrennzeichen .

Wenn wir also eine Reihe von Operationen haben, bei denen die erste Operation eine scanner.nextInt () und dann eine scanner.nextLine () ist und als Eingabe, wenn wir eine Ganzzahl angeben und einen Zeilenumbruch drücken, werden beide Operationen ausgeführt.

Die nextInt () - API verwendet die Ganzzahl und die nextLine () - API verwendet das Zeilentrennzeichen und setzt den Scanner an den Anfang der nächsten Zeile.

6. Überprüfen Sie die Eingabe

Nun wollen wir sehen, wie die Eingabe mit einem Scanner überprüft wird . Im folgenden Beispiel verwenden wir die Scanner- Methode hasNextInt () , um zu überprüfen, ob die Eingabe ein ganzzahliger Wert ist:

@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. Scannen Sie einen String

Weiter - sehen wir uns an, wie Sie einen String mit dem Scanner scannen :

@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(); }

Hinweis: Die Methode nextInt (16) liest das nächste Token als hexadezimalen Ganzzahlwert.

8. Muster suchen

Nun wollen wir sehen, wie Sie mit dem Scanner ein Muster finden .

Im folgenden Beispiel verwenden wir findInLine () , um nach einem Token zu suchen, das dem angegebenen Muster in der gesamten Eingabe entspricht:

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

Wir haben gelernt, wie man Eingaben aus Dateien, Konsolen oder Zeichenfolgen mit dem Scanner liest . Wir haben auch gelernt, wie man ein Muster mit dem Scanner findet und überspringt sowie wie man das Scanner- Trennzeichen ändert .

Die Implementierung dieser Beispiele finden Sie auf GitHub.