Java-scanner

1. Oversigt over Scanner

I denne hurtige vejledning illustrerer vi, hvordan du bruger Java Scanner klasse - for at læse input, finde og springe mønstre over med forskellige afgrænsere.

2. Scan en fil

Først - lad os se, hvordan man læser en fil ved hjælp af Scanner.

I det følgende eksempel - vi læser en fil indeholder “Hej Verden”Til tokens:

@Test offentlig ugyldig nårReadFileWithScanner_thenCorrect () kaster IOException {Scannerscanner = ny scanner (ny fil ("test.txt")); assertTrue (scanner.hasNext ()); assertEquals ("Hej", scanner.next ()); assertEquals ("verden", scanner.next ()); scanner.close (); }

Bemærk, at Næste() metode returnerer den næste Snor token her.

Bemærk også, hvordan vi lukker scanneren, når vi er færdige med at bruge den.

3. Konverter InputStream til Snor

Næste - lad os se, hvordan man konverterer en InputStream ind i en Snor ved hjælp af en Scanner:

@Test offentlig ugyldigt nårConvertInputStreamToString_thenConverted () kaster IOException {String expectValue = "Hej verden"; FileInputStream inputStream = ny FileInputStream ("test.txt"); Scannerscanner = ny scanner (inputStream); scanner.useDelimiter ("A"); Strengresultat = scanner.next (); assertEquals (forventet værdi, resultat); scanner.close (); }

I lighed med det foregående eksempel brugte vi Scanner for at tokenisere hele strømmen fra begyndelsen til den næste regex “A” - som matcher den fulde input.

4. Scanner vs. BufferedReader

Lad os nu diskutere forskellen mellem Scanner og BufferedReader - vi bruger generelt:

  • BufferedReader når vi vil læse input i linjer
  • Scanner for at læse input i tokens

I det følgende eksempel læser vi en fil i linjer ved hjælp af BufferedReader:

@Test offentlig ugyldig nårReadUsingBufferedReader_thenCorrect () kaster IOException {String firstLine = "Hej verden"; String secondLine = "Hej, John"; BufferedReader-læser = ny BufferedReader (ny FileReader ("test.txt")); Strengresultat = reader.readLine (); assertEquals (firstLine, resultat); resultat = reader.readLine (); assertEquals (secondLine, resultat); reader.close (); }

Lad os nu bruge det Scanner at læse den samme fil i tokens:

@Test offentlig ugyldig nårReadUsingScanner_thenCorrect () kaster IOException {String firstLine = "Hej verden"; FileInputStream inputStream = ny FileInputStream ("test.txt"); Scannerscanner = ny scanner (inputStream); Strengresultat = scanner.nextLine (); assertEquals (firstLine, resultat); scanner.useDelimiter (","); assertEquals ("Hej", scanner.next ()); assertEquals ("John", scanner.next ()); scanner.close (); }

Bemærk hvordan vi bruger Scannernæste linje () API - at læse hele linjen.

5. Scan input fra konsol ved hjælp af Ny scanner (System.in)

Næste - lad os se, hvordan man læser input fra konsollen ved hjælp af a Scanner eksempel:

@Test offentlig ugyldig nårReadingInputFromConsole_thenCorrect () {String input = "Hej"; InputStream stdin = System.in; System.setIn (ny ByteArrayInputStream (input.getBytes ())); Scannerscanner = ny scanner (System.in); Strengresultat = scanner.next (); assertEquals (input, resultat); System.setIn (stdin); scanner.close (); }

Bemærk, at vi brugte System.setIn (…) for at simulere noget input, der kommer fra konsollen.

5.1. næste linje () API

Denne metode returnerer simpelthen strengen på den aktuelle linje:

scanner.nextLine ();

Dette læser indholdet af den aktuelle linje og returnerer det bortset fra enhver linjeseparator i slutningen - i dette tilfælde - det nye linjetegn.

Efter at have læst indholdet, Scanner indstiller sin position til starten af ​​den næste linje. Det vigtige punkt at huske er, at næste linje () API forbruger linjeseparatoren og flytter positionen for Scanner til næste linje.

Så næste gang hvis vi læser igennem Scanner vi læser fra starten af ​​den næste linje.

5.2. næsteInt () API

Denne metode scanner det næste token af ​​input som en int:

scanner.nextInt ();

API'en læser det heltalstoken, der er tilgængeligt næste.

I dette tilfælde, hvis det næste token er et heltal, og efter heltalet, er der en linjeseparator, skal du altid huske at næsteInt () vil ikke forbruge linjeseparatoren. I stedet for vil scanneren være selve linjeseparatoren.

Så hvis vi har en række operationer, hvor den første operation er en scanner.nextInt () og så scanner.nextLine () og som input, hvis vi giver et heltal og tryk på linjeskift, udføres begge operationer.

Det næsteInt () API vil forbruge heltal og næste linje () API forbruger linjeseparatoren og placeres Scanner til starten af ​​den næste linje.

6. Valider input

Lad os nu se, hvordan man validerer input ved hjælp af en Scanner. I det følgende eksempel bruger vi Scanner metode hasNextInt () for at kontrollere, om input er en heltal:

@Test offentlig ugyldig nårValidateInputUsingScanner_thenValidated () kaster IOException {String input = "2000"; InputStream stdin = System.in; System.setIn (ny ByteArrayInputStream (input.getBytes ())); Scannerscanner = ny scanner (System.in); boolsk isIntInput = scanner.hasNextInt (); assertTrue (isIntInput); System.setIn (stdin); scanner.close (); }

7. Scan en Snor

Næste - lad os se, hvordan man scanner en Snor ved brug af Scanner:

@Test offentlig ugyldig nårScanString_thenCorrect () kaster IOException {String input = "Hej 1 F 3.5"; Scannerscanner = ny scanner (input); assertEquals ("Hej", scanner.next ()); assertEquals (1, scanner.nextInt ()); assertEquals (15, scanner.nextInt (16)); assertEquals (3.5, scanner.nextDouble (), 0,00000001); scanner.close (); }

Bemærk: Metoden næsteInt (16) læser det næste token som en hexadecimal heltalværdi.

8. Find Mønster

Lad os nu se, hvordan man finder en Mønster ved brug af Scanner.

I det følgende eksempel bruger vi findInLine () til søg efter et token, der matcher det givne Mønster i hele input:

@Test offentlig ugyldig når FindPatternUsingScanner_thenFound () kaster IOException {String expectValue = "verden"; FileInputStream inputStream = ny FileInputStream ("test.txt"); Scannerscanner = ny scanner (inputStream); Strengresultat = scanner.findInLine ("wo..d"); assertEquals (forventet værdi, resultat); scanner.close (); }

Vi kan også søge efter en Mønster i det specifikke domæne ved hjælp af findWithinHorizon () som i følgende eksempel:

@Test offentlig ugyldig nårFindPatternInHorizon_thenFound () kaster IOException {String expectValue = "world"; FileInputStream inputStream = ny FileInputStream ("test.txt"); Scannerscanner = ny scanner (inputStream); Strengresultat = scanner.findWithinHorizon ("wo..d", 5); assertNull (resultat); resultat = scanner.findWithinHorizon ("wo..d", 100); assertEquals (forventet værdi, resultat); scanner.close (); }

Bemærk, at søgehorisont er simpelthen antallet af tegn inden for hvilken søgningen udføres.

9. Spring over Mønster

Næste - lad os se, hvordan man springer en over Mønster i Scanner. Vi kan springe over tokens, der matcher et bestemt mønster, mens vi læser input ved hjælp af Scanner.

I det følgende eksempel springer vi over “Hej”Token ved hjælp af Scanner metode springe():

@Test offentlig ugyldig nårSkipPatternUsingScanner_thenSkipped () kaster IOException {FileInputStream inputStream = ny FileInputStream ("test.txt"); Scannerscanner = ny scanner (inputStream); scanner.skip (". e.lo"); assertEquals ("verden", scanner.next ()); scanner.close (); }

10. Skift Scanner Afgrænser

Endelig - lad os se, hvordan du ændrer Scanner afgrænser. I det følgende eksempel ændrer vi standard Scanner afgrænsning til “o“:

@Test offentlig ugyldig nårChangeScannerDelimiter_thenChanged () kaster IOException {String expectValue = "Hej verden"; Streng [] splittet = forventet værdi.split ("o"); FileInputStream inputStream = ny FileInputStream ("test.txt"); Scannerscanner = ny scanner (inputStream); scanner.useDelimiter ("o"); assertEquals (opdelt [0], scanner.next ()); assertEquals (opdelt [1], scanner.next ()); assertEquals (opdelt [2], scanner.next ()); scanner.close (); }

Vi kan også bruge flere afgrænsere. I det følgende eksempel - vi bruger begge kommaer “,”Og bindestreg””Som afgrænsere for at scanne en fil indeholder“John, Adam-Tom“:

@Test offentligt ugyldigt nårReadWithScannerTwoDelimiters_thenCorrect () kaster IOException - "); assertEquals (" John ", scanner.next ()); assertEquals (" Adam ", scanner.next ()); assertEquals (" Tom ", scanner.next () ); scanner.close (); 

Bemærk: Standard Scanner afgrænsning er hvidt mellemrum.

11. Konklusion

I denne vejledning gik vi over flere virkelige eksempler på brug af Java-scanner.

Vi lærte at læse input fra fil, konsol eller Snor ved brug af Scanner; vi lærte også, hvordan man finder og springer over et mønster ved hjælp af Scanner - samt hvordan man ændrer Scanner afgrænser.

Implementeringen af ​​disse eksempler findes på GitHub.