BufferedReader vs Console vs Scanner i Java

1. Oversikt

I denne artikkelen skal vi gå gjennom forskjellene mellom BufferedReader, Konsoll, og Skanner klasser i Java.

For å ta et dypdykk på hvert emne, foreslår vi å ta en titt på våre individuelle artikler om Java Scanner, Console I / O i Java og BufferedReader.

2. Brukerinngang

Gitt den underliggende strømmen sendt til konstruktørene, både BufferedReader og Skanner klasser er i stand til å håndtere et bredere spekter av brukerinngang, for eksempel en streng, fil, systemkonsoll (som vanligvis er koblet til tastaturet) og stikkontakt.

På den annen side, den Konsoll klasse er designet for kun å få tilgang til den tegnbaserte systemkonsollen, hvis noen, tilknyttet den nåværende Java-virtuelle maskinen.

La oss ta en titt på BufferedReader konstruktører, som godtar forskjellige innganger:

BufferedReader br = new BufferedReader (new StringReader ("Bufferedreader vs Console vs Scanner in Java")); BufferedReader br = ny BufferedReader (ny FileReader ("file.txt")); BufferedReader br = new BufferedReader (new InputStreamReader (System.in)) Socket socket = new Socket (hostName, portNumber); BufferedReader br = ny BufferedReader (ny InputStreamReader (socket.getInputStream ())); 

De Skanner klasse kunne på samme måte akseptere forskjellige innganger i sine konstruktører også:

Scanner sc = new Scanner ("Bufferedreader vs Console vs Scanner in Java") Scanner sc = new Scanner (new File ("file.txt")); Skanner sc = ny skanner (System.in); Stikkontakt = ny stikkontakt (hostName, portNumber); Skanner sc = ny skanner (socket.getInputStream ());

De Konsoll klasse er bare tilgjengelig via metoden samtale:

Konsollkonsoll = System.console ();

Vær oppmerksom på at når vi bruker Konsoll klasse, er ikke den JVM-tilknyttede systemkonsollen tilgjengelig hvis vi kjører koden i en IDE som Eclipse eller IntelliJ IDEA.

3. Brukerutgang

I motsetning til BufferedReader og Skanner klasser, som ikke skriver noe til utgangsstrømmen, Konsoll klassen tilbyr noen praktiske metoder som readPassword (String fmt, Object ... args), readLine (String fmt, Object ... args), og printf (strengformat, objekt ... args), for å skrive ledeteksten til systemkonsollens utgangsstrøm:

String firstName = console.readLine ("Skriv inn fornavnet ditt:"); console.printf ("Velkommen" + fornavn);

Så når vi skriver et program for å samhandle med systemkonsollen, Konsoll klasse vil forenkle koden ved å fjerne unødvendig System.out.println.

4. Analyseinngang

De Skanner klasse kan analysere primitive typer og strenger ved å bruke regulære uttrykk.

Det bryter sine innspill i tokens ved hjelp av et tilpasset skillemønster, som standard samsvarer med mellomrom:

Strenginngang = "Bufferedreader vs Console vs Scanner"; Scanner sc = new Scanner (input) .useDelimiter ("\ s * vs \ s *"); System.out.println (sc.next ()); System.out.println (sc.next ()); System.out.println (sc.next ()); sc.close ();

BufferredReader og Konsoll klasser leser ganske enkelt inngangsstrømmen slik den er.

5. Lesing av sikre data

De Konsoll klasse har metoder readPassword () og readPassword (streng fmt, Object ... args) å lese sikre data med ekko deaktivert, slik at brukerne ikke ser hva de skriver:

Strengpassord = String.valueOf (console.readPassword ("Passord:")); 

BufferedReader og Skanner har ingen mulighet til å gjøre det.

6. Trådsikker

Lesemetodene i BufferedReader og lese- og skrivemetodene i Konsoll er alle synkronisert, mens de i Skanner klasse er ikke. Hvis vi leser brukerinngangen i et program med flere tråder, heller BufferedReader eller Konsoll vil være et bedre alternativ.

7. Bufferstørrelse

Bufferstørrelsen er 8 kB in BufferedReader sammenlignet med 1 kB i Skanner klasse.

I tillegg kan vi spesifisere bufferstørrelsen i konstruktøren av BufferedReader klasse om nødvendig. Dette vil hjelpe når du leser de lange strengene fra brukerinndata. Konsoll klasse har ingen buffer når du leser fra systemkonsollen, men den har en bufret utgangsstrøm for å skrive til systemkonsollen.

8. Diverse

Det er noen forskjeller som ikke er de viktigste faktorene vi vurderer når vi velger den rette klassen som skal brukes i forskjellige situasjoner.

8.1. Lukke inngangsstrømmen

Når vi oppretter forekomsten av BufferedReader eller Skanner, vi må husk å lukke den for å unngå minnelekkasje. Men dette skjer ikke med Konsoll klasse - vi trenger ikke å lukke systemkonsollen etter bruk.

8.2. Avvikshåndtering

Samtidig som Skanner og Konsoll gå med den ukontrollerte unntakstilnærmingen, metoder i BufferedReader kaste avkryssede unntak, som tvinger oss til å skrive kjele-pladesyntaks for å håndtere unntakene.

9. Konklusjon

Nå som vi har uttalt forskjellene mellom disse klassene, la oss komme med noen tommelfingerregler angående hvilke (n) som er best egnet til å takle forskjellige situasjoner:

  • Bruk BufferedReader hvis vi trenger å lese lange strenger fra en fil, da den har bedre ytelse enn Skanner
  • Ta i betraktning Konsoll hvis vi leser sikre data fra systemkonsollen og ønsker å skjule det som blir skrevet
  • Bruk Skanner hvis vi trenger å analysere inngangsstrømmen med et tilpasset regulært uttrykk
  • Skanner ville være å foretrekke når vi kommuniserer med systemkonsollen, da det tilbyr finkornede metoder for å lese og analysere inngangsstrømmen. I tillegg er ikke ytelsen ulempe et stort problem, som i de fleste tilfeller, nesteXXX metodene blokkerer og vent på manuell inndata
  • I en trådsikker sammenheng, vurder BufferedReader med mindre vi må bruke funksjoner som er spesifikke for Konsoll klasse