BufferedReader vs Konsole vs Scanner in Java

BufferedReader vs Konsole vs Scanner in Java

1. Überblick

In diesem Artikel gehen wir zuwalk through the differences between BufferedReader, Console, and Scanner classes in Java.

Um einen tiefen Einblick in jedes Thema zu erhalten, empfehlen wir Ihnen, einen Blick auf unsere einzelnen Artikel zuJava Scanner,Console I/O in Java undBufferedReader zu werfen.

2. Benutzereingabe

Angesichts des zugrunde liegenden Streams, der an die Konstruktoren übergeben wird, sindboth BufferedReader and Scanner classes are able to handle a wider range of user input, z. B. eine Zeichenfolge, eine Datei, eine Systemkonsole (die normalerweise mit der Tastatur verbunden ist) und ein Socket.

Andererseits ist die KlasseConsoleo konzipiert, dass sie nur auf die zeichenbasierte Systemkonsole zugreift, die der aktuellen virtuellen Java-Maschine zugeordnet ist.

Schauen wir uns die Konstruktoren vonBufferedReaderan, die unterschiedliche Eingaben akzeptieren:

BufferedReader br = new BufferedReader(
  new StringReader("Bufferedreader vs Console vs Scanner in Java"));
BufferedReader br = new BufferedReader(
  new FileReader("file.txt"));
BufferedReader br = new BufferedReader(
  new InputStreamReader(System.in))

Socket socket = new Socket(hostName, portNumber);
BufferedReader br =  new BufferedReader(
  new InputStreamReader(socket.getInputStream()));

DieScanner-Klasse könnte in ähnlicher Weise auch unterschiedliche Eingaben in ihren Konstruktoren akzeptieren:

Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java")
Scanner sc = new Scanner(new File("file.txt"));
Scanner sc = new Scanner(System.in);

Socket socket = new Socket(hostName, portNumber);
Scanner sc =  new Scanner(socket.getInputStream());

Die KlasseConsole ist nur über den Methodenaufruf verfügbar:

Console console = System.console();

Beachten Sie bitte, dass bei Verwendung der KlasseConsoledie JVM-zugeordnete Systemkonsole nicht verfügbar ist, wenn wir den Code in einer IDE wie Eclipse oder IntelliJ IDEA ausführen.

3. Benutzerausgabe

In contrast to BufferedReader and Scanner classes, which don’t write anything to the output stream, the Console class offers some convenient methods wiereadPassword (String fmt, Object… args), readLine (String fmt, Object… args), undprintf (String format,Object… args),to write the prompt to the system console’s output stream:

String firstName = console.readLine("Enter your first name please: ");
console.printf("Welcome " + firstName );

Wenn wir also ein Programm für die Interaktion mit der Systemkonsole schreiben, vereinfacht die KlasseConsoleden Code, indem unnötigeSystem.out.println entfernt werden.

4. Parsing-Eingabe

The Scanner class can parse primitive types and strings using regular expressions.

Die Eingabe in Token wird mithilfe eines benutzerdefinierten Trennmusters aufgeteilt, das standardmäßig mit Leerzeichen übereinstimmt:

String input = "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();

Die KlassenBufferredReader undConsole lesen den Eingabestream einfach so, wie er ist.

5. Lesen sicherer Daten

Die KlasseConsole verfügt über die MethodenreadPassword() undreadPassword (String fmt, Object… args) , um die sicheren Daten mit deaktiviertem Echo zu lesen, sodass Benutzer nicht sehen, was sie eingeben:

String password = String.valueOf(console.readPassword("Password :"));

BufferedReader undScanner sind dazu nicht in der Lage.

6. Thread sicher

Die Lesemethoden inBufferedReader und die Lese- und Schreibmethoden inConsole sind allesynchronized, während dies in der KlasseScanner nicht der Fall ist. If we read the user input in a multi-threaded program, either BufferedReader or Console will be a better option.

7. Puffergröße

The buffer size is 8 KB in BufferedReader as compared to 1 KB in Scanner class.

Außerdem können wir bei Bedarf die Puffergröße im Konstruktor der Klassethe BufferedReaderangeben. Dies hilft beim Lesen der langen Zeichenfolgen aus Benutzereingaben. Console class has no buffer when reading from the system console, verfügt jedoch über einen gepufferten Ausgabestream zum Schreiben in die Systemkonsole.

8. Sonstiges

Es gibt einige Unterschiede, die nicht die Hauptfaktoren sind, die wir bei der Auswahl der geeigneten Klasse für verschiedene Situationen berücksichtigen.

8.1. Schließen des Eingabestreams

Sobald wir die Instanz vonBufferedReader oderScanner erstellt haben, müssen wirremember to close it in order to avoid a memory leak erstellen. Dies ist jedoch bei der KlasseConsolenicht der Fall - wir müssen die Systemkonsole nach der Verwendung nicht schließen.

8.2. Ausnahmebehandlung

WährendScanner undConsole mit dem ungeprüften Ausnahmeansatz arbeiten, lösen Methoden inBufferedReader geprüfte Ausnahmen aus, was uns zwingt, eine Try-Catch-Syntax für Boilerplates zu schreiben, um die Ausnahmen zu behandeln.

9. Fazit

Nachdem wir nun die Unterschiede zwischen diesen Klassen angegeben haben, wollen wir uns einigerules of thumb regarding which one(s) are best suited to tackle different situations einfallen lassen:

  • Verwenden SieBufferedReader, wenn Sie lange Zeichenfolgen aus einer Datei lesen müssen, da diese eine bessere Leistung alsScanner aufweist

  • Berücksichtigen SieConsole, wenn wir sichere Daten von der Systemkonsole lesen und die Eingabe verbergen möchten

  • Verwenden SieScanner, wenn Sie den Eingabestream mit einem benutzerdefinierten regulären Ausdruck analysieren müssen

  • Scanner wird bevorzugt, wenn wir mit der Systemkonsole interagieren, da sie feinkörnige Methoden zum Lesen und Analysieren des Eingabestreams bietet. Darüber hinaus ist der Leistungsnachteil kein großes Problem, da in den meisten Fällen dienextXXX-Methoden blockieren und auf manuelle Eingaben warten

  • Berücksichtigen Sie in einem threadsicheren KontextBufferedReader, es sei denn, wir müssen Funktionen verwenden, die für die KlasseConsole spezifisch sind