Java-skanner

1. Oversikt over Skanner

I denne raske opplæringen vil vi illustrere hvordan du bruker Java Skanner klasse - for å lese innspill, finne og hoppe over mønstre med forskjellige skilletegn.

2. Skann en fil

Først - la oss se hvordan du leser en fil ved hjelp av Skanner.

I det følgende eksemplet - vi leser en fil som inneholder “Hei Verden”Til tokens:

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

Merk at neste () metoden returnerer den neste String token her.

Legg også merke til hvordan vi lukker skanneren når vi er ferdig med å bruke den.

3. Konverter InputStream til String

Neste - la oss se hvordan du konverterer en InputStream inn i en String bruker en Skanner:

@Test offentlig ugyldig nårConvertInputStreamToString_thenConverted () kaster IOException {String expectValue = "Hello world"; FileInputStream inputStream = ny FileInputStream ("test.txt"); Skannerskanner = ny skanner (inputStream); scanner.useDelimiter ("A"); Strengresultat = scanner.next (); assertEquals (forventet verdi, resultat); scanner.close (); }

I likhet med forrige eksempel brukte vi Skanner for å tokenisere hele strømmen fra begynnelsen til neste regex “A” - som samsvarer med hele inngangen.

4. Skanner vs. BufferedReader

La oss nå diskutere forskjellen mellom Skanner og BufferedReader - vi bruker generelt:

  • BufferedReader når vi vil lese innspillene i linjer
  • Skanner for å lese innspillene i tokens

I det følgende eksemplet - vi leser en fil i linjer ved hjelp av BufferedReader:

@Test offentlig ugyldig nårReadUsingBufferedReader_thenCorrect () kaster IOException {String firstLine = "Hello world"; String secondLine = "Hei, John"; BufferedReader-leser = ny BufferedReader (ny FileReader ("test.txt")); Strengresultat = reader.readLine (); assertEquals (firstLine, resultat); resultat = reader.readLine (); assertEquals (secondLine, resultat); reader.close (); }

La oss nå bruke det Skanner å lese den samme filen i tokens:

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

Legg merke til hvordan vi bruker Skannerneste linje () API - å lese hele linjen.

5. Skann inngang fra konsoll med Ny skanner (System.in)

Neste - la oss se hvordan du leser innspill fra konsollen ved hjelp av a Skanner forekomst:

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

Merk at vi brukte System.setIn (…) for å simulere noen innspill fra konsollen.

5.1. neste linje () API

Denne metoden returnerer bare strengen på gjeldende linje:

scanner.nextLine ();

Dette leser innholdet på gjeldende linje og returnerer det bortsett fra hvilken som helst linjeseparator på slutten - i dette tilfellet - det nye linjetegnet.

Etter å ha lest innholdet, Skanner setter sin posisjon til starten av neste linje. Det viktige poenget å huske er at neste linje () API forbruker linjeseparatoren og flytter posisjonen til Skanner til neste linje.

Så neste gang hvis vi leser gjennom Skanner vi skal lese fra starten av neste linje.

5.2. nesteInt () API

Denne metoden skanner neste token av inngangen som en int:

scanner.nextInt ();

API-et leser heltall-token som er tilgjengelig neste.

I dette tilfellet, hvis neste token er et heltall, og etter heltallet, er det en linjeseparator, husk alltid at nesteInt () vil ikke forbruke linjeskilleren. I stedet vil skanneren være selve linjeskilleren.

Så hvis vi har en serie operasjoner, der den første operasjonen er a scanner.nextInt () og så scanner.nextLine () og som en inngang hvis vi gir et heltall og trykk på linjeskift, vil begge operasjonene bli utført.

De nesteInt () API vil forbruke heltallet og neste linje () API vil konsumere linjeskilleren og plasseres Skanner til starten av neste linje.

6. Bekreft inndata

La oss nå se hvordan vi kan validere inndata ved hjelp av a Skanner. I det følgende eksemplet - bruker vi Skanner metode hasNextInt () for å sjekke om inngangen er en heltallverdi:

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

7. Skann a String

Neste - la oss se hvordan du skanner en String ved hjelp av Skanner:

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

Merk: Metoden nextInt (16) leser neste token som en heksadesimalt heltallverdi.

8. Finn Mønster

Nå - la oss se hvordan du finner en Mønster ved hjelp av Skanner.

I det følgende eksemplet - bruker vi findInLine () til søk etter et token som samsvarer med det gitte Mønster i hele inngangen:

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

Vi kan også søke etter en Mønster i det spesifikke domenet ved hjelp av findWithinHorizon () som i følgende eksempel:

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

Merk at søkehorisont er ganske enkelt antall tegn som søket utføres innenfor.

9. Hopp over Mønster

Neste - la oss se hvordan du hopper over en Mønster i Skanner. Vi kan hoppe over tokens som samsvarer med et bestemt mønster mens vi leser inndataene ved hjelp av Skanner.

I det følgende eksemplet - hopper vi over “Hallo”Token ved hjelp av Skanner metode hopp over ():

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

10. Endre Skanner Avgrenser

Til slutt - la oss se hvordan du endrer Skanner avgrensning. I det følgende eksemplet - endrer vi standard Skanner avgrense til “o“:

@Test offentlig ugyldig nårChangeScannerDelimiter_thenChanged () kaster IOException {String expectValue = "Hello world"; Streng [] splittet = expectValue.split ("o"); FileInputStream inputStream = ny FileInputStream ("test.txt"); Skannerskanner = ny skanner (inputStream); scanner.useDelimiter ("o"); assertEquals (delt [0], scanner.next ()); assertEquals (delt [1], scanner.next ()); assertEquals (delt [2], scanner.next ()); scanner.close (); }

Vi kan også bruke flere avgrensere. I det følgende eksemplet - bruker vi begge kommaene “,”Og dash””Som avgrensere for å skanne en fil inneholder“John, Adam-Tom“:

@Test offentlig ugyldig nårReadWithScannerTwoDelimiters_thenCorrect () kaster IOException - "); assertEquals (" John ", scanner.next ()); assertEquals (" Adam ", scanner.next ()); assertEquals (" Tom ", scanner.next () ); skanner. lukk (); 

Merk: misligholde Skanner avgrensning er mellomrom.

11. Konklusjon

I denne opplæringen gikk vi over flere virkelige eksempler på bruk av Java-skanner.

Vi lærte å lese innspill fra fil, konsoll eller String ved hjelp av Skanner; vi lærte også hvordan vi kan finne og hoppe over et mønster Skanner - samt hvordan du endrer Skanner avgrensning.

Implementeringen av disse eksemplene finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found