BufferedReader vs Console vs Scanner u Javi

1. Pregled

U ovom ćemo članku prošetati razlikama između BufferedReader, Konzola, i Skener satovi na Javi.

Da biste detaljno zarobili svaku temu, predlažemo da pogledate naše pojedinačne članke o Java Scanner-u, I / O-u konzole u Javi i BufferedReader-u.

2. Unos korisnika

S obzirom da je temeljni tok prešao na konstruktore, oba BufferedReader i Skener klase su u stanju obraditi širi raspon korisničkih unosa, poput niza, datoteke, sistemske konzole (koja je obično povezana s tipkovnicom) i utičnice.

S druge strane, Konzola class namijenjen je pristupu samo sistemskoj konzoli temeljenoj na znakovima, ako postoji, povezanoj s trenutnim virtualnim strojem Java.

Pogledajmo BufferedReader konstruktori, koji prihvaćaju različite ulaze:

BufferedReader br = novi BufferedReader (novi StringReader ("Bufferedreader vs konzola vs skener u Javi")); BufferedReader br = novi BufferedReader (novi FileReader ("file.txt")); BufferedReader br = novi BufferedReader (novi InputStreamReader (System.in)) Socket socket = new Socket (hostName, portNumber); BufferedReader br = novi BufferedReader (novi InputStreamReader (socket.getInputStream ())); 

The Skener klasa bi također mogla prihvatiti različite ulaze u svoje konstruktore:

Skener sc = novi Skener ("Bufferedreader vs Konzola vs Skener u Javi") Skener sc = novi Skener (nova datoteka ("file.txt")); Skener sc = novi Skener (System.in); Socket socket = nova utičnica (hostName, portNumber); Skener sc = novi Skener (socket.getInputStream ());

The Konzola klasa je dostupna samo putem poziva metode:

Konzola konzole = System.console ();

Imajte na umu da kada koristimo Konzola klase, sistemska konzola pridružena JVM-u nije dostupna ako kôd pokrenemo u IDE-u poput Eclipse ili IntelliJ IDEA.

3. Izlaz korisnika

Za razliku od BufferedReader i Skener klase, koje ne zapisuju ništa u izlazni tok, Konzola klasa nudi nekoliko prikladnih metoda Kao readPassword (String fmt, Object ... args), readLine (String fmt, Object ... args), i printf (format niza, objekt ... argumenti), za pisanje upita u izlazni tok sistemske konzole:

String firstName = console.readLine ("Unesite svoje ime molim:"); console.printf ("Dobrodošli" + firstName);

Pa kad napišemo program za interakciju sa sistemskom konzolom, Konzola klasa pojednostavit će kôd uklanjanjem nepotrebnih System.out.println.

4. Raščlanjivanje ulaza

The Skener klasa može raščlaniti primitivne tipove i nizove pomoću regularnih izraza.

Ulaz u tokene razbija pomoću prilagođenog uzorka graničnika, koji se prema zadanim postavkama podudara s razmakom:

String input = "Bufferedreader vs Console vs Scanner"; Skener sc = novi Skener (ulaz) .useDelimiter ("\ s * vs \ s *"); System.out.println (sc.next ()); System.out.println (sc.next ()); System.out.println (sc.next ()); sc.close ();

BufferredReader i Konzola klase jednostavno čitaju ulazni tok kakav jest.

5. Čitanje sigurnih podataka

The Konzola razred ima metode readPassword () i readPassword (String fmt, Objekt ... argumenti) za čitanje sigurnih podataka s onemogućenim odjekom, tako da korisnici neće vidjeti što pišu:

Lozinka niza = String.valueOf (console.readPassword ("Lozinka:")); 

BufferedReader i Skener nemaju mogućnosti za to.

6. Navoj siguran

Metode čitanja u BufferedReader i metode čitanja i pisanja u Konzola su svi sinkronizirano, dok oni u Skener razreda nisu. Ako čitamo korisnički unos u programu s više niti, bilo koji BufferedReader ili Konzola bit će bolja opcija.

7. Veličina pufera

Veličina međuspremnika iznosi 8 KB BufferedReader u usporedbi s 1 KB u Skener razred.

Uz to, možemo odrediti veličinu međuspremnika u konstruktoru datoteke BufferedReader razred ako je potrebno. To će vam pomoći pri čitanju dugih nizova iz korisničkog unosa. Konzola class nema međuspremnik prilikom čitanja s sistemske konzole, ali ima me uspremljeni izlazni tok za pisanje na sistemsku konzolu.

8. Razno

Postoje neke razlike koje nisu glavni čimbenici koje uzimamo u obzir pri odabiru odgovarajuće klase za upotrebu u raznim situacijama.

8.1. Zatvaranje ulaznog toka

Jednom kada stvorimo instancu BufferedReader ili Skener, moramo ne zaboravite ga zatvoriti kako biste izbjegli curenje memorije. Ali to se ne događa s Konzola klasa - ne trebamo zatvoriti sistemsku konzolu nakon upotrebe.

8.2. Rukovanje iznimkama

Dok Skener i Konzola idi s pristupom neprovjerene iznimke, metode u BufferedReader baciti provjerene iznimke, što nas prisiljava da napišemo sintaksu try-catch za obradu izuzetaka.

9. Zaključak

Sad kad smo naveli razlike među ovim razredima, hajde da dođemo do nekih osnovna pravila o tome koji su najprikladniji za rješavanje različitih situacija:

  • Koristiti BufferedReader ako trebamo čitati duge nizove iz datoteke, jer ima bolju izvedbu od Skener
  • Smatrati Konzola ako čitamo sigurne podatke s sistemske konzole i želimo sakriti ono što se upisuje
  • Koristiti Skener ako moramo raščlaniti ulazni tok s prilagođenim regularnim izrazom
  • Skener bilo bi poželjno kada komuniciramo sa sistemskom konzolom, jer nudi precizne metode za čitanje i raščlanjivanje ulaznog toka. Osim toga, nedostatak izvedbe nije velik problem, kao u većini slučajeva nextXXX metode blokiraju i čekaju ručni unos
  • U kontekstu zaštićenom niti, razmotrite BufferedReader osim ako ne moramo koristiti značajke specifične za Konzola razred