BufferedReader vs Console vs Scanner v Jave

1. Prehľad

V tomto článku sa chystáme prechádzať rozdiely medzi BufferedReader, Konzolaa Skener triedy v Jave.

Ak sa chcete hlboko ponoriť do každej témy, odporúčame vám pozrieť sa na naše jednotlivé články o Java Scanneri, I / O konzole v Java a BufferedReader.

2. Vstup používateľa

Vzhľadom na podkladový prúd odovzdaný konštruktérom, oboje BufferedReader a Skener triedy sú schopné zvládnuť širší rozsah vstupov používateľov, ako napríklad reťazec, súbor, systémová konzola (ktorá je zvyčajne pripojená ku klávesnici) a soket.

Na druhej strane Konzola trieda je navrhnutá iba na prístup k znakovej systémovej konzole, ak existuje, spojenej s aktuálnym virtuálnym strojom Java.

Poďme sa pozrieť na BufferedReader konštruktéri, ktorí prijímajú rôzne vstupy:

BufferedReader br = nový BufferedReader (nový StringReader ("Bufferedreader vs Console vs Scanner v Jave")); BufferedReader br = nový BufferedReader (nový FileReader ("file.txt")); BufferedReader br = nový BufferedReader (nový InputStreamReader (System.in)) Socket socket = nový Socket (hostName, portNumber); BufferedReader br = nový BufferedReader (nový InputStreamReader (socket.getInputStream ())); 

The Skener trieda mohla podobne prijať rôzne vstupy aj do svojich konštruktorov:

Skener sc = nový skener ("Bufferedreader vs Console vs skener v Jave") Skener sc = nový skener (nový súbor ("file.txt")); Scanner sc = nový skener (System.in); Socket socket = new Socket (hostName, portNumber); Skener sc = nový Skener (socket.getInputStream ());

The Konzola trieda je k dispozícii iba prostredníctvom volania metódy:

Konzola konzoly = System.console ();

Majte na pamäti, že keď používame Konzola triedy, systémová konzola asociovaná s JVM nie je k dispozícii, ak spustíme kód v IDE, napríklad Eclipse alebo IntelliJ IDEA.

3. Užívateľský výstup

Na rozdiel od BufferedReader a Skener triedy, ktoré do výstupného toku nič nezapisujú, Konzola triedy ponúka niekoľko pohodlných metód Páči sa mi to readPassword (String fmt, Object… args), readLine (String fmt, Object… args), a printf (formát reťazca, objekt ... args), zapísať výzvu do výstupného toku systémovej konzoly:

Reťazec firstName = console.readLine ("Zadajte prosím svoje krstné meno:"); console.printf ("Vitajte" + meno);

Takže keď píšeme program na interakciu so systémovou konzolou, Konzola triedy zjednoduší kód odstránením nepotrebných System.out.println.

4. Vstup na analýzu

The Skener trieda dokáže analyzovať primitívne typy a reťazce pomocou regulárnych výrazov.

Rozdeľuje svoj vstup na tokeny pomocou vlastného oddeľovacieho vzoru, ktorý sa štandardne zhoduje s medzerami:

Reťazcový vstup = "Bufferedreader vs Console vs Scanner"; Skener sc = nový Skener (vstup) .useDelimiter ("\ s * vs \ s *"); System.out.println (sc.next ()); System.out.println (sc.next ()); System.out.println (sc.next ()); sc.close ();

BufferredReader a Konzola triedy jednoducho načítajú vstupný prúd taký, aký je.

5. Čítanie zabezpečených údajov

The Konzola trieda má metódy readPassword () a readPassword (reťazec fmt, Objekt… args) čítať zabezpečené údaje so zakázaným ozvenou, aby používatelia nevideli, čo píšu:

Reťazcové heslo = String.valueOf (console.readPassword ("Heslo:")); 

BufferedReader a Skener nie sú schopní tak urobiť.

6. Vlákno bezpečné

Metódy čítania v BufferedReader a metódy čítania a zápisu v systéme Windows Konzola sú všetci synchronizované, zatiaľ čo tí v Skener triedy nie sú. Ak čítame vstup používateľa vo viacvláknovom programe, buď BufferedReader alebo Konzola bude lepšou voľbou.

7. Veľkosť vyrovnávacej pamäte

Veľkosť vyrovnávacej pamäte je 8 kB v BufferedReader v porovnaní s 1 kB v Skener trieda.

Okrem toho môžeme určiť veľkosť medzipamäte v konštruktore BufferedReader triedy v prípade potreby. To pomôže pri čítaní dlhých reťazcov zo vstupu používateľa. Konzola trieda nemá medzipamäť pri čítaní zo systémovej konzoly, ale má výstupný prúd v medzipamäti na zápis do systémovej konzoly.

8. Rôzne

Existujú určité rozdiely, ktoré nie sú hlavnými faktormi, ktoré zohľadňujeme pri výbere vhodnej triedy na použitie v rôznych situáciách.

8.1. Uzatvára sa vstupný prúd

Akonáhle vytvoríme inštanciu BufferedReader alebo Skener, musíme nezabudnite ho zavrieť, aby ste predišli úniku pamäte. Ale to sa nestane s Konzola trieda - po použití nemusíme zatvárať systémovú konzolu.

8.2. Spracovanie výnimiek

Zatiaľ čo Skener a Konzola ísť s nekontrolovaným prístupom k výnimkám, metódam v BufferedReader hádzať kontrolované výnimky, čo nás núti písať štandardnú try-catch syntax na spracovanie výnimiek.

9. Záver

Teraz, keď sme uviedli rozdiely medzi týmito triedami, poďme s niekoľkými všeobecné pravidlá týkajúce sa toho, ktoré z nich sú najvhodnejšie na riešenie rôznych situácií:

  • Použite BufferedReader ak potrebujeme načítať dlhé reťazce zo súboru, pretože má lepší výkon ako Skener
  • Zvážte Konzola ak čítame zabezpečené údaje zo systémovej konzoly a chceme skryť to, čo sa práve píše
  • Použite Skener ak potrebujeme analyzovať vstupný tok pomocou vlastného regulárneho výrazu
  • Skener by bolo uprednostňované pri interakcii so systémovou konzolou, pretože ponúka jemnozrnné metódy na čítanie a analýzu vstupného toku. Okrem toho výkonová nevýhoda nie je veľkým problémom, ako vo väčšine prípadov nextXXX metódy blokujú a čakajú na ručné zadanie
  • V kontexte bezpečnom pre vlákna zvážte BufferedReader pokiaľ nebudeme musieť používať funkcie špecifické pre Konzola trieda

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