Java Scanner hasNext () vs. hasNextLine ()

1. Oversigt

Det Scanner class er et praktisk værktøj, der kan analysere primitive typer og strenge ved hjælp af regulære udtryk og blev introduceret i java.util pakke i Java 5.

I denne korte vejledning vil vi tale om dens hasNext () og hasNextLine () metoder. Selvom disse to metoder måske ser temmelig ens ud, laver de faktisk helt forskellige kontroller.

Du kan også læse mere om den alsidige Scannerklasse i hurtigguiden her.

2. hasNext ()

2.1. Grundlæggende brug

Den hasNext () metode kontrollerer, om Scanner har et andet token i sin input. EN Scanner bryder sit input i tokens ved hjælp af et skillemønster, der som standard matcher det hvide område. Det er, hasNext () kontrollerer input og returnerer rigtigt hvis den har et andet tegn, der ikke er mellemrum.

Vi skal også bemærke et par detaljer om standardadskilleren:

  • Hvidt mellemrum indeholder ikke kun mellemrumstegnet, men også faneområde (\ t), linjefodring (\ n) og endnu flere tegn
  • Kontinuerlige tegn i mellemrummet behandles som en enkelt afgrænser
  • De tomme linjer i slutningen af ​​inputet udskrives ikke - det vil sige hasNext () vender tilbage falsk for tomme linjer

Lad os se på et eksempel på hvordan hasNext () fungerer med standardafgrænseren. Først forbereder vi en inputstreng til at hjælpe os med at udforske SdåseParsingsresultat:

String INPUT = ny StringBuilder () .append ("magisk \ tprojekt \ n") .append ("database: oracle \ n") .append ("afhængigheder: \ n") .append ("spring: foo: bar \ n ") .append (" \ n ") // Bemærk, at input ender med en tom linje .toString ();

Lad os derefter analysere input og udskrive resultatet:

Scannerscanner = ny scanner (INPUT); mens (scanner.hasNext ()) {log.info (scanner.next ()); } log.info ("-------- OUTPUT - END ---------") 

Hvis vi kører ovenstående kode, ser vi konsoludgangen:

[DEMO] magisk [DEMO] projekt [DEMO] database: [DEMO] orakel [DEMO] afhængigheder: [DEMO] fjeder: foo: bar [DEMO] -------- OUTPUT - END ----- ---- 

2.2. Med brugerdefineret afgrænsning

Indtil videre har vi set på hasNext () med standardafgrænseren. Det Scanner klasse giver en useDelimiter (streng mønster) metode det giver os mulighed for at ændre skillelinjen. Når skillelinjen er ændret, vises hasNext () metode foretager kontrollen med den nye afgrænser i stedet for standard.

Lad os se et andet eksempel på hvordan hasNext () og Næste() arbejde med en brugerdefineret afgrænser. Vi genbruger input fra det sidste eksempel.

Når scanneren analyserer et token, der matcher strengen “afhængigheder:“, Vi ændrer skillelinjen til et kolon ( : ) så vi kan analysere og udtrække hver værdi af afhængighederne:

mens (scanner.hasNext ()) {String token = scanner.next (); if ("afhængigheder:". er lig med (token)) {scanner.useDelimiter (":"); } log.info (token); } log.info ("-------- OUTPUT - END ---------");

Lad os se det resulterende output:

[DEMO] magisk [DEMO] projekt [DEMO] database: [DEMO] orakel [DEMO] afhængigheder: [DEMO] fjeder [DEMO] foo [DEMO] bjælke [DEMO] -------- OUTPUT - END- --------

Store! Vi har med succes ekstraheret værdierne i “afhængigheder”Der er dog nogle uventede problemer med linjeskift. Vi får se, hvordan man undgår dem i det næste afsnit.

2.3. Med regex som afgrænser

Lad os gennemgå output i sidste afsnit. Først bemærkede vi, at der er en linjeskift (\ n) Før "forår“. Vi har ændret skillelinjen til “:" efter “Afhængigheder:” token blev hentet. Linjepausen efter “afhængigheder:”Bliver nu den del af det næste token. Derfor, hasNext () vendt tilbage rigtigt og linjeskiftet blev udskrevet.

Af samme grund er linjefødningen efter “dvale”Og den sidste tomme linje bliver den del af det sidste symbol, så to tomme linjer udskrives sammen med“dvale“.

Hvis vi kan lave både kolon og hvidt mellemrum som afgrænser, bliver "afhængighedsværdierne" parset korrekt, og vores problem vil blive løst. Lad os ændre det for at opnå det useDelimiter (“:”) opkald:

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

Det ": | \ s +”Her er et regulært udtryk, der matcher et enkelt“: ”eller et eller flere tegn i mellemrummet. Med denne rettelse bliver output til:

[DEMO] magisk [DEMO] projekt [DEMO] database: [DEMO] orakel [DEMO] afhængigheder: [DEMO] fjeder [DEMO] foo [DEMO] bar [DEMO] -------- OUTPUT - END- --------

3. hasNextLine ()

Det hasNextLine () metode kontrollerer, om der er en anden linje i input af Scanner objekt, uanset om linjen er tom eller ej.

Lad os tage det samme input igen. Denne gang tilføjer vi linjenumre foran hver linje i input ved hjælp af hasNextLine () og næste linje () metoder:

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

Lad os nu se på vores output:

[DEMO] 1 | magisk projekt [DEMO] 2 | database: oracle [DEMO] 3 | afhængigheder: [DEMO] 4 | fjeder: foo: bar [DEMO] 5 | [DEMO] -------- UDGANG - SLUT ---------

Som vi forventede, udskrives linjenumrene, og den sidste tomme linje er også der.

4. Konklusion

I denne artikel har vi lært det Scanner'S hasNextLine () metode kontrollerer, om der er en anden linje i inputet, uanset om linjen er tom eller ikke, mens hasNext () bruger en afgrænser til at kontrollere for et andet token.

Som altid er den komplette kildekode til eksemplerne tilgængelig på GitHub.