BufferedReader vs Console vs Scanner i Java

1. Oversigt

I denne artikel skal vi gå gennem forskellene mellem BufferedReader, Konsolog Scanner klasser i Java.

For at få et dybt dyk på hvert emne, foreslår vi at se på vores individuelle artikler om Java Scanner, Console I / O i Java og BufferedReader.

2. Brugerinput

I betragtning af den underliggende strøm sendt til konstruktørerne, begge BufferedReader og Scanner klasser er i stand til at håndtere en bredere vifte af brugerinput, såsom en streng, fil, systemkonsol (som typisk er forbundet til tastaturet) og stikkontakt.

På den anden side er Konsol klasse er designet til kun at få adgang til den tegnbaserede systemkonsol, hvis en sådan er tilknyttet den aktuelle Java-virtuelle maskine.

Lad os se på BufferedReader konstruktører, der accepterer forskellige input:

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

Det Scanner klasse kunne også acceptere forskellige input i sine konstruktører:

Scanner sc = ny Scanner ("Bufferedreader vs Console vs Scanner in Java") Scanner sc = ny Scanner (ny fil ("file.txt")); Scanner sc = ny Scanner (System.in); Socket-sokkel = ny Socket (hostName, portNumber); Scanner sc = ny Scanner (socket.getInputStream ());

Det Konsol klasse er kun tilgængelig via metodeopkaldet:

Konsolkonsol = System.console ();

Husk, at når vi bruger Konsol klasse er den JVM-tilknyttede systemkonsol ikke tilgængelig, hvis vi kører koden inden for en IDE som Eclipse eller IntelliJ IDEA.

3. Brugeroutput

I kontrast til BufferedReader og Scanner klasser, der ikke skriver noget til outputstrømmen, Konsol klasse tilbyder nogle praktiske metoder synes godt om readPassword (String fmt, Object ... args), readLine (String fmt, Object ... args), og printf (strengformat, objekt ... args), for at skrive prompten til systemkonsolens outputstrøm:

String firstName = console.readLine ("Indtast dit fornavn venligst:"); console.printf ("Velkommen" + fornavn);

Så når vi skriver et program til at interagere med systemkonsollen, Konsol klasse forenkler koden ved at fjerne unødvendigt System.out.println.

4. Parsing input

Det Scanner klasse kan analysere primitive typer og strenge ved hjælp af regulære udtryk.

Det bryder sit input i tokens ved hjælp af et brugerdefineret afgrænsningsmønster, der som standard matcher det hvide område:

String input = "Bufferedreader vs Console vs Scanner"; Scanner sc = ny 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 Konsol klasser læser simpelthen inputstrømmen, som den er.

5. Læsning af sikre data

Det Konsol klasse har metoder readPassword () og readPassword (streng fmt, Objekt ... args) at læse de sikre data med ekko deaktiveret, så brugerne ikke kan se, hvad de skriver:

Strengadgangskode = String.valueOf (console.readPassword ("Adgangskode:")); 

BufferedReader og Scanner har ingen mulighed for at gøre det.

6. Trådsikker

Læsemetoderne i BufferedReader og læse- og skrivemetoderne i Konsol er alle synkroniseret, mens de i Scanner klasse er ikke. Hvis vi læser brugerinput i et multitrådet program, enten BufferedReader eller Konsol vil være en bedre mulighed.

7. Bufferstørrelse

Bufferstørrelsen er 8 KB in BufferedReader sammenlignet med 1 KB i Scanner klasse.

Derudover kan vi specificere bufferstørrelsen i konstruktøren af BufferedReader klasse, hvis det er nødvendigt. Dette hjælper, når du læser de lange strenge fra brugerinput. Konsol klasse har ingen buffer, når man læser fra systemkonsollen, men den har en bufferet outputstrøm til at skrive til systemkonsollen.

8. Diverse

Der er nogle forskelle, der ikke er de vigtigste faktorer, vi overvejer, når vi vælger den passende klasse, der skal bruges i forskellige situationer.

8.1. Lukning af inputstrømmen

Når vi opretter forekomsten af BufferedReader eller Scanner, vi er nødt til husk at lukke det for at undgå en hukommelseslækage. Men dette sker ikke med Konsol klasse - vi behøver ikke at lukke systemkonsollen efter brug.

8.2. Undtagelse Håndtering

Mens Scanner og Konsol gå med den ukontrollerede undtagelsesmetode, metoder i BufferedReader smid afkrydsede undtagelser, som tvinger os til at skrive kedelplade-prøv-fangssyntaks for at håndtere undtagelserne.

9. Konklusion

Nu hvor vi har erklæret forskellene mellem disse klasser, lad os komme med nogle tommelfingerregler om, hvilke (n) der er bedst egnet til at tackle forskellige situationer:

  • Brug BufferedReader hvis vi har brug for at læse lange strenge fra en fil, da den har bedre ydeevne end Scanner
  • Overveje Konsol hvis vi læser sikre data fra systemkonsollen og vil skjule det, der skrives
  • Brug Scanner hvis vi har brug for at analysere inputstrømmen med et brugerdefineret regulært udtryk
  • Scanner ville være at foretrække, når vi interagerer med systemkonsollen, da den tilbyder finkornede metoder til at læse og analysere inputstrømmen. Derudover er præstationsnedsættelsen ikke et stort problem, som i de fleste tilfælde næsteXXX metoder blokerer og venter på manuel input
  • Overvej i en trådsikker sammenhæng BufferedReader medmindre vi er nødt til at bruge funktioner, der er specifikke for Konsol klasse

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