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