Skener Java hasNext () vs. hasNextLine ()

1. Prehľad

The Skener class je šikovný nástroj, ktorý dokáže analyzovať primitívne typy a reťazce pomocou regulárnych výrazov a bol zavedený do súboru java.util balík v Jave 5.

V tomto krátkom tutoriáli si povieme niečo o ňom hasNext () a hasNextLine () metódy. Aj keď sa spočiatku tieto dve metódy môžu zdať dosť podobné, v skutočnosti robia celkom odlišné kontroly.

Tu si tiež môžete prečítať viac informácií o univerzálnej triede skenerov v rýchlom sprievodcovi.

2. hasNext ()

2.1. Základné použitie

HasNext () metóda kontroluje, či Skener má vo svojom vstupe ďalší token. A Skener rozdelí svoj vstup na tokeny pomocou oddeľovacieho vzoru, ktorý sa štandardne zhoduje s medzerami. To znamená, hasNext () skontroluje vstup a vráti sa pravda ak má iný nebiely znak.

Mali by sme tiež poznamenať niekoľko podrobností o predvolenom oddeľovači:

  • Medzery zahŕňajú nielen znak medzery, ale aj medzeru tabulátora (\ t), riadok (\ n) a ešte viac znakov
  • So súvislými prázdnymi znakmi sa zaobchádza ako s jedným oddeľovačom
  • Prázdne riadky na konci vstupu sa nevytlačia - to znamená, hasNext () vracia nepravdivé pre prázdne riadky

Pozrime sa na príklad ako hasNext () pracuje s predvoleným oddeľovačom. Najskôr si pripravíme vstupný reťazec, ktorý nám pomôže preskúmať S.plechovkaVýsledok analýzy:

String INPUT = new StringBuilder () .append ("magic \ tproject \ n") .append ("database: oracle \ n") .append ("dependencies: \ n") .append ("spring: foo: bar \ n ") .append (" \ n ") // Upozorňujeme, že vstup končí prázdnym riadkom .toString ();

Ďalej analyzujeme vstup a vytlačíme výsledok:

Skener skener = nový skener (VSTUP); while (scanner.hasNext ()) {log.info (scanner.next ()); } log.info ("-------- VÝSTUP - KONIEC ---------") 

Ak spustíme vyššie uvedený kód, uvidíme výstup konzoly:

[DEMO] mágia [DEMO] projekt [DEMO] databáza: [DEMO] Oracle [DEMO] závislosti: [DEMO] jar: foo: bar [DEMO] -------- VÝSTUP - KONIEC ----- ---- 

2.2. S vlastným oddeľovačom

Doteraz sme sa pozreli na hasNext () s predvoleným oddeľovačom. The Skener trieda poskytuje a useDelimiter (reťazcový vzor) metóda to nám umožňuje zmeniť oddeľovač. Po zmene oddeľovača sa znak hasNext () metóda vykoná kontrolu pomocou nového oddeľovača namiesto predvoleného.

Pozrime sa na ďalší príklad ako hasNext () a Ďalšie() pracovať s vlastným oddeľovačom. Znovu použijeme vstup z posledného príkladu.

Po tom, čo skener analyzuje token zodpovedajúci reťazcu „závislosti:„, Zmeníme oddeľovač na dvojbodku ( : ) aby sme mohli analyzovať a extrahovať každú hodnotu závislostí:

while (scanner.hasNext ()) {Reťazec token = scanner.next (); if ("dependencies:". equals (token)) {scanner.useDelimiter (":"); } log.info (token); } log.info ("-------- VÝSTUP - KONIEC ---------");

Pozrime sa na výsledný výstup:

[DEMO] mágia [DEMO] projekt [DEMO] databáza: [DEMO] závislosti [DEMO] závislosti: [DEMO] jar [DEMO] foo [DEMO] lišta [DEMO] -------- VÝSTUP - KONIEC --------

Skvelé! Hodnoty v „závislosti„Existujú však nejaké neočakávané problémy s prerušením linky. Uvidíme, ako sa im vyhnúť v ďalšej časti.

2.3. S regulárny výraz ako oddeľovač

Pozrime sa na výstup v poslednej časti. Najprv sme si všimli, že je zalomenie riadku (\ n) pred „jar„. Oddeľovač sme zmenili na „:" po „Závislosti:“ token bol načítaný. Prerušenie riadku po „závislosti:”Sa stáva súčasťou nasledujúceho tokenu. Preto hasNext () vrátený pravda a zalomenie riadku bolo vytlačené.

Z rovnakého dôvodu bude posuv riadka po „prezimovať„A posledný prázdny riadok sa stane súčasťou posledného tokenu, takže sa vytlačia dva prázdne riadky spolu s„prezimovať“.

Ak dokážeme ako oddeľovač vytvoriť dvojbodku aj medzery, potom sa hodnoty závislostí správne analyzujú a náš problém sa vyrieši. Aby sme to dosiahli, zmeňme useDelimiter („:“) hovor:

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

: | \ s +„Tu je regulárny výraz zodpovedajúci jednému„: “alebo jednému alebo viacerým znakom medzier. Vďaka tejto oprave sa výstup zmení na:

[DEMO] mágia [DEMO] projekt [DEMO] databáza: [DEMO] závislosti [DEMO] závislosti: [DEMO] jar [DEMO] foo [DEMO] lišta [DEMO] -------- VÝSTUP - KONIEC --------

3. hasNextLine ()

The hasNextLine () metóda skontroluje, či je na vstupe iného riadku Skener objekt, bez ohľadu na to, či je riadok prázdny alebo nie.

Zopakujme ten istý vstup. Tentokrát pridáme čísla riadkov pred každý riadok na vstupe pomocou hasNextLine () a nextLine () metódy:

int i = 0; while (scanner.hasNextLine ()) log.info (String.format ("% d log.info (" -------- VÝSTUP - KONIEC --------- ");

Poďme sa teraz pozrieť na náš výstup:

[DEMO] 1 | magický projekt [DEMO] 2 | databáza: oracle [DEMO] 3 | závislosti: [DEMO] 4 | jar: foo: bar [DEMO] 5 | [DEMO] -------- VÝSTUP - KONIEC ---------

Ako sme očakávali, vytlačia sa čísla riadkov a je tu tiež posledný prázdny riadok.

4. Záver

V tomto článku sme sa to dozvedeli Skener‘S hasNextLine () metóda skontroluje, či je na vstupe ďalší riadok, bez ohľadu na to, či je riadok prázdny alebo nie hasNext () používa oddeľovač na kontrolu iného tokenu.

Kompletný zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.


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