BufferedReader versus console versus scanner in Java

1. Overzicht

In dit artikel gaan we dat doen doorloop de verschillen tussen BufferedReader, Troosten, en Scanner klassen in Java.

Om dieper op elk onderwerp te duiken, raden we aan om onze afzonderlijke artikelen over Java Scanner, Console I / O in Java en BufferedReader te bekijken.

2. Gebruikersinvoer

Gezien de onderliggende stroom doorgegeven aan de constructeurs, beide BufferedReader en Scanner klassen kunnen een breder scala aan gebruikersinvoer verwerken, zoals een string, bestand, systeemconsole (die doorgaans is verbonden met het toetsenbord) en socket.

Aan de andere kant is het Troosten class is ontworpen om alleen toegang te krijgen tot de op tekens gebaseerde systeemconsole, indien aanwezig, die is gekoppeld aan de huidige virtuele Java-machine.

Laten we eens kijken naar de BufferedReader constructeurs, die verschillende invoer accepteren:

BufferedReader br = nieuwe BufferedReader (nieuwe StringReader ("Bufferedreader vs Console vs Scanner in Java")); BufferedReader br = nieuwe BufferedReader (nieuwe FileReader ("file.txt")); BufferedReader br = nieuwe BufferedReader (nieuwe InputStreamReader (System.in)) Socket socket = nieuwe Socket (hostnaam, poortnummer); BufferedReader br = nieuwe BufferedReader (nieuwe InputStreamReader (socket.getInputStream ())); 

De Scanner class kan op dezelfde manier ook verschillende invoer in zijn constructors accepteren:

Scanner sc = nieuwe scanner ("Bufferedreader versus console versus scanner in Java") Scanner sc = nieuwe scanner (nieuw bestand ("file.txt")); Scanner sc = nieuwe scanner (System.in); Socket socket = nieuwe socket (hostnaam, poortnummer); Scanner sc = nieuwe scanner (socket.getInputStream ());

De Troosten class is alleen beschikbaar via de method call:

Consoleconsole = System.console ();

Houd er rekening mee dat wanneer we de Troosten class, is de aan JVM gekoppelde systeemconsole niet beschikbaar als we de code uitvoeren binnen een IDE zoals Eclipse of IntelliJ IDEA.

3. Gebruikersoutput

In contrast met BufferedReader en Scanner klassen, die niets naar de uitvoerstroom schrijven, de Troosten class biedt een aantal handige methoden Leuk vinden readPassword (String fmt, Object ... args), readLine (String fmt, Object ... args), en printf (String-formaat, Object ... args), om de prompt naar de uitvoerstroom van de systeemconsole te schrijven:

String firstName = console.readLine ("Voer alstublieft uw voornaam in:"); console.printf ("Welkom" + voornaam);

Dus als we een programma schrijven om te communiceren met de systeemconsole, Troosten class vereenvoudigt de code door onnodige System.out.println.

4. Invoer parseren

De Scanner class kan primitieve typen en strings parseren met behulp van reguliere expressies.

Het verdeelt zijn invoer in tokens met behulp van een aangepast scheidingstekenpatroon, dat standaard overeenkomt met witruimte:

String input = "Bufferedreader vs console vs scanner"; Scanner sc = nieuwe scanner (invoer) .useDelimiter ("\ s * vs \ s *"); System.out.println (sc.next ()); System.out.println (sc.next ()); System.out.println (sc.next ()); sc.close ();

BufferredReader en Troosten klassen lezen gewoon de invoerstroom zoals die is.

5. Veilige gegevens lezen

De Troosten klasse heeft methoden readPassword () en readPassword (String fmt, Object ... args) om de beveiligde gegevens te lezen met uitgeschakelde echo, zodat gebruikers niet zien wat ze typen:

String wachtwoord = String.valueOf (console.readPassword ("Wachtwoord:")); 

BufferedReader en Scanner niet in staat zijn om dat te doen.

6. Draadveilig

De leesmethoden in BufferedReader en de lees- en schrijfmethoden in Troosten zijn alle gesynchroniseerd, terwijl die in de Scanner klasse zijn dat niet. Als we de gebruikersinvoer ook lezen in een programma met meerdere threads BufferedReader of Troosten zal een betere optie zijn.

7. Buffergrootte

De buffergrootte is 8 KB in BufferedReader vergeleken met 1 KB in Scanner klasse.

Bovendien kunnen we de buffergrootte specificeren in de constructor van de BufferedReader klasse indien nodig. Dit zal helpen bij het lezen van de lange reeksen van gebruikersinvoer. Troosten klasse heeft geen buffer bij het lezen van de systeemconsole, maar het heeft een gebufferde uitvoerstroom om naar de systeemconsole te schrijven.

8. Diversen

Er zijn enkele verschillen die niet de belangrijkste factoren zijn waarmee we rekening houden bij het kiezen van de juiste klasse voor gebruik in verschillende situaties.

8.1. De invoerstroom sluiten

Zodra we de instantie van BufferedReader of Scanner, we moeten vergeet niet om het te sluiten om een ​​geheugenlek te voorkomen. Maar dit gebeurt niet met de Troosten class - we hoeven de systeemconsole na gebruik niet te sluiten.

8.2. Afhandeling van uitzonderingen

Terwijl Scanner en Troosten ga met de ongecontroleerde uitzonderingsbenadering, methoden in BufferedReader throw gecontroleerde uitzonderingen, wat ons dwingt om de standaard try-catch syntaxis te schrijven om de uitzonderingen af ​​te handelen.

9. Conclusie

Nu we de verschillen tussen deze klassen hebben aangegeven, laten we er een paar bedenken vuistregels over welke (en) het meest geschikt zijn om verschillende situaties aan te pakken:

  • Gebruik BufferedReader als we lange strings uit een bestand moeten lezen, omdat het betere prestaties heeft dan Scanner
  • Overwegen Troosten als we beveiligde gegevens van de systeemconsole lezen en willen verbergen wat er wordt getypt
  • Gebruik Scanner als we de invoerstroom moeten parseren met een aangepaste reguliere expressie
  • Scanner zou de voorkeur hebben als we communiceren met de systeemconsole, omdat het fijnmazige methoden biedt om de invoerstroom te lezen en te ontleden. Bovendien is het prestatienadeel geen groot probleem, zoals in de meeste gevallen de volgendeXXX methoden blokkeren en wachten op handmatige invoer
  • Overweeg in een threadveilige context BufferedReader tenzij we functies moeten gebruiken die specifiek zijn voor het Troosten klasse

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