A Java szkenner hasNext () vs hasNextLine ()

1. Áttekintés

A Scanner osztály egy praktikus eszköz, amely a primitív típusokat és karakterláncokat elemezheti reguláris kifejezésekkel, és bevezetésre került a java.util csomag a Java 5-ben.

Ebben a rövid bemutatóban beszélünk róla hasNext () és hasNextLine () mód. Annak ellenére, hogy ez a két módszer eleinte meglehetősen hasonló lehet, valójában egészen más ellenőrzéseket végeznek.

A sokoldalú Scanner osztályról itt olvashat bővebben.

2. hasNext ()

2.1. Alapvető használat

A hasNext () módszer ellenőrzi, hogy a Scanner van egy másik token a bemenetében. A Scanner a bemenetet tokenekre bontja egy elválasztó mintával, amely alapértelmezés szerint megegyezik a szóközzel. Vagyis hasNext () ellenőrzi az inputot és visszatér igaz ha van még egy nem fehér szóköz karaktere.

Meg kell jegyeznünk néhány részletet az alapértelmezett határolóról:

  • A szóköz nem csak a szóköz, hanem a tabulátor (\ t), soremelés (\ n), és még több karaktert
  • A folyamatos szóköz karaktereket egyetlen elválasztóként kezeljük
  • A bemenet végén található üres sorokat nem nyomtatják ki, vagyis hasNext () visszatér hamis üres sorokhoz

Vessünk egy pillantást a hogyanra hasNext () az alapértelmezett határolóval működik. Először elkészítünk egy bemeneti karakterláncot, amely segít felfedezni S-tkonzervgyárosElemzési eredménye:

String INPUT = új StringBuilder () .append ("magic \ tproject \ n") .append ("database: oracle \ n") .append ("dependencies: \ n") .append ("spring: foo: bar \ n ") .append (" \ n ") // Ne feledje, hogy a bemenet egy üres sorral zárul .toString ();

Ezután elemezzük a bemenetet, és kinyomtatjuk az eredményt:

Szkenner szkenner = új szkenner (INPUT); while (szkenner.hasNext ()) {log.info (szkenner.next ()); } log.info ("-------- OUTPUT - END ---------") 

Ha futtatjuk a fenti kódot, látni fogjuk a konzol kimenetét:

[DEMO] magic [DEMO] projekt [DEMO] adatbázis: [DEMO] oracle [DEMO] függőségek: [DEMO] rugó: foo: bar [DEMO] -------- OUTPUT - END ----- ---- 

2.2. Egyéni határolóval

Eddig megnéztük hasNext () az alapértelmezett határolóval. A Scanner osztály biztosítja a useDelimiter (karakterlánc minta) módszer amely lehetővé teszi számunkra a határoló megváltoztatását. A határoló megváltoztatása után a hasNext () A metódus az alapértelmezett helyett az új elválasztóval végzi el az ellenőrzést.

Lássunk egy másik példát, hogyan hasNext () és következő() dolgozzon egyedi elválasztóval. Újra felhasználjuk az utolsó példa bemenetét.

Miután a szkenner elemzett egy karakterláncot, amely megfelel a "függőségek:„, Az elválasztót kettőspontra változtatjuk ( : ) hogy elemezhessük és kivonhassuk a függőségek egyes értékeit:

while (szkenner.hasNext ()) {String token = szkenner.next (); if ("függőségek:". egyenlő (token)) {szkenner.useDelimiter (":"); } log.info (token); } log.info ("-------- OUTPUT - END ---------");

Lássuk az eredményt:

[DEMO] magic [DEMO] projekt [DEMO] adatbázis: [DEMO] oracle [DEMO] függőségek: [DEMO] rugós [DEMO] foo [DEMO] sáv [DEMO] -------- OUTPUT - END- --------

Nagy! Sikeresen kivontuk az értékeket afüggőségek„Vannak azonban váratlan sortörési problémák. A következő szakaszban megtudjuk, hogyan kerülhetők el ezek.

2.3. Val vel regex mint Elhatároló

Nézzük át a kimenetet az utolsó szakaszban. Először azt vettük észre, hogy sortörés van (\ n) előtttavaszi“. Megváltoztattuk az elválasztót:" azután „Függőségek:” jelző beolvasásra került. A sortörés a “függőségek:”Most a következő token részévé válik. Ebből kifolyólag, hasNext () visszatért igaz és a sortörést kinyomtatták.

Ugyanezen okból a sorcsatorna a „Hibernálás”És az utolsó üres sor az utolsó token részévé válik, így két üres sort nyomtatunk aHibernálás“.

Ha mind a kettőspontot, mind a szóközt el tudjuk határolni, akkor a „függőségek” értékeit helyesen elemezzük, és a problémánk megoldódik. Ennek elérése érdekében változtassunk a useDelimiter (“:”) hívás:

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

A ": | \ s +”Itt van egy reguláris kifejezés, amely egyetlen„: ”vagy egy vagy több szóköz karaktert tartalmaz. Ezzel a javítással a kimenet:

[DEMO] magic [DEMO] projekt [DEMO] adatbázis: [DEMO] oracle [DEMO] függőségek: [DEMO] rugós [DEMO] foo [DEMO] sáv [DEMO] -------- OUTPUT - END- --------

3. hasNextLine ()

A hasNextLine () metódus ellenőrzi, hogy van-e másik sor a Scanner objektum, függetlenül attól, hogy a sor üres-e vagy sem.

Vegyük újra ugyanazt a bemenetet. Ezúttal a sorszámokkal egészítjük ki a bevitelt minden sor elé hasNextLine () és nextLine () mód:

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

Most nézzük meg a kimenetünket:

[DEMO] 1 | mágikus projekt [DEMO] 2 | adatbázis: oracle [DEMO] 3 | függőségek: [DEMO] 4 | rugó: foo: bar [DEMO] 5 | [DEMO] -------- KIMENET - VÉGE ---------

Ahogy számítottunk rá, a sorszámok kinyomtatásra kerülnek, és az utolsó üres sor is ott van.

4. Következtetés

Ebben a cikkben ezt megtanultuk Scanner’S hasNextLine () metódus ellenőrzi, hogy van-e másik sor a bemenetben, függetlenül attól, hogy a sor üres vagy sem, míg hasNext () egy elválasztót használ egy másik token ellenőrzésére.

Mint mindig, a példák teljes forráskódja elérhető a GitHub oldalon.