Java Scanner hasNext () vs. hasNextLine ()

1. Oversikt

De Skanner class er et praktisk verktøy som kan analysere primitive typer og strenger ved å bruke regulære uttrykk og ble introdusert i java.util pakke i Java 5.

I denne korte opplæringen vil vi snakke om dens hasNext () og hasNextLine () metoder. Selv om disse to metodene i begynnelsen kan se ganske like ut, gjør de faktisk ganske forskjellige kontroller.

Du kan også lese mer om den allsidige skannerklassen i hurtigveiledningen her.

2. hasNext ()

2.1. Grunnleggende bruk

Den hasNext () metoden sjekker om Skanner har et annet token i innspillene. EN Skanner bryter sine innspill i tokens ved hjelp av et skillemønster, som samsvarer med mellomrom som standard. Det er, hasNext () sjekker inngangen og returnerer ekte hvis den har et annet tegn som ikke er mellomrom.

Vi bør også merke noen detaljer om standardavgrenseren:

  • Mellomrom inkluderer ikke bare mellomromstegnet, men også tabulatorplass (\ t), linjeskift (\ n), og enda flere tegn
  • Kontinuerlige tegn i mellomrom behandles som en enkelt avgrenser
  • De tomme linjene på slutten av inngangen skrives ikke ut - det vil si hasNext () returnerer falsk for blanke linjer

La oss se på et eksempel på hvordan hasNext () fungerer med standard skilletegn. Først skal vi forberede en inngangsstreng for å hjelpe oss med å utforske ShermetikkAnalyseringsresultat:

String INPUT = ny StringBuilder () .append ("magisk \ tprojekt \ n") .append ("database: oracle \ n") .append ("avhengigheter: \ n") .append ("spring: foo: bar \ n ") .append (" \ n ") // Merk at inngangen slutter med en tom linje .toString ();

Deretter la oss analysere inngangen og skrive ut resultatet:

Skannerskanner = ny skanner (INPUT); mens (scanner.hasNext ()) {log.info (scanner.next ()); } log.info ("-------- UTGANG - SLUT ---------") 

Hvis vi kjører ovennevnte kode, ser vi konsollutgangen:

[DEMO] magisk [DEMO] prosjekt [DEMO] database: [DEMO] orakel [DEMO] avhengigheter: [DEMO] fjær: foo: bar [DEMO] -------- UTGANG - SLUT ----- ---- 

2.2. Med tilpasset skillelinje

Så langt har vi sett på hasNext () med standard skilletegn. De Skanner klasse gir en useDelimiter (strengmønster) metode som lar oss endre skilletegn. Når avgrenseren er endret, blir hasNext () metoden vil gjøre sjekken med den nye skillelinjen i stedet for den som er standard.

La oss se et annet eksempel på hvordan hasNext () og neste () arbeid med en egendefinert skilletegn. Vi vil bruke innspillene fra det siste eksemplet på nytt.

Etter at skanneren analyserer et token som samsvarer med strengen “avhengigheter:“, Vi endrer skilletegnet til et kolon ( : ) slik at vi kan analysere og trekke ut hver verdi av avhengighetene:

mens (scanner.hasNext ()) {String token = scanner.next (); if ("avhengigheter:". tilsvarer (token)) {scanner.useDelimiter (":"); } log.info (token); } log.info ("-------- UTGANG - SLUT ---------");

La oss se den resulterende produksjonen:

[DEMO] magisk [DEMO] prosjekt [DEMO] database: [DEMO] orakel [DEMO] avhengigheter: [DEMO] vår [DEMO] foo [DEMO] bar [DEMO] -------- OUTPUT - END- --------

Flott! Vi har vellykket hentet ut verdiene i “avhengigheter“Derimot er det noen uventede problemer med linjeskift. Vi får se hvordan vi kan unngå dem i neste avsnitt.

2.3. Med regex som skilletegn

La oss se på produksjonen i den siste delen. Først la vi merke til at det er en linjeskift (\ n) før "vår“. Vi har endret skilletegnet til “:" etter “Avhengigheter:” token ble hentet. Linjeskiftet etter “avhengigheter:Blir nå den delen av neste token. Derfor, hasNext () returnert ekte og linjeskiftet ble skrevet ut.

Av samme grunn, linjefôringen etter “dvale”Og den siste blanke linjen blir delen av det siste token, så to blanke linjer skrives ut sammen med“dvale“.

Hvis vi kan lage både kolon og hvitt mellomrom som avgrensning, vil "avhengighets" -verdiene bli korrekt analysert og problemet vårt blir løst. For å oppnå det, la oss endre useDelimiter (“:”) anrop:

scanner.useDelimiter (": | \ s +"); 

: | \ s +”Her er et vanlig uttrykk som samsvarer med et enkelt“: ”eller ett eller flere mellomromstegn. Med denne løsningen blir utgangen til:

[DEMO] magisk [DEMO] prosjekt [DEMO] database: [DEMO] orakel [DEMO] avhengigheter: [DEMO] vår [DEMO] foo [DEMO] bar [DEMO] -------- OUTPUT - END- --------

3. hasNextLine ()

De hasNextLine () metoden sjekker for å se om det er en annen linje i inngangen til Skanner objekt, uansett om linjen er tom eller ikke.

La oss ta samme innspill igjen. Denne gangen legger vi til linjenumre foran hver linje i inngangen ved hjelp av hasNextLine () og neste linje () metoder:

int i = 0; while (scanner.hasNextLine ()) log.info (String.format ("% d log.info (" -------- OUTPUT - END --------- ");

La oss ta en titt på produksjonen vår:

[DEMO] 1 | magisk prosjekt [DEMO] 2 | database: oracle [DEMO] 3 | avhengigheter: [DEMO] 4 | vår: foo: bar [DEMO] 5 | [DEMO] -------- UTGANG - SLUTT ---------

Som vi forventet, blir linjenumrene skrevet ut, og den siste tomme linjen er der også.

4. Konklusjon

I denne artikkelen har vi lært det Skanner‘S hasNextLine () metoden sjekker om det er en annen linje i inngangen, uansett om linjen er blank eller ikke, mens hasNext () bruker en skilletegn for å se etter et annet token.

Som alltid er den komplette kildekoden for eksemplene tilgjengelig på GitHub.


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