Soweit ich weiß, sind die beiden häufigsten Methoden der Lesezeichenbasierten Daten aus einer Datei in Java verwendet Scanner
oder BufferedReader
. Ich weiß auch, dass die BufferedReader
Dateien effizient gelesen werden, indem ein Puffer verwendet wird, um physische Festplattenoperationen zu vermeiden.
Meine Fragen sind:
- Funktioniert
Scanner
so gut wieBufferedReader
? - Warum würden Sie wählen ,
Scanner
überBufferedReader
oder umgekehrt?
java
file-io
java.util.scanner
bufferedreader
Mads Mobæk
quelle
quelle
Antworten:
Scanner
wird zum Parsen von Token aus dem Inhalt des Streams verwendet, währendBufferedReader
nur der Stream gelesen wird und keine spezielle Analyse durchgeführt wird.Tatsächlich können Sie a
BufferedReader
an ascanner
als Quelle für zu analysierende Zeichen übergeben.quelle
Scanner
hängt letztendlich von etwas anderem für seine Eingabe ab, das durchaus synchronisiert werden kann.In der derzeit neuesten JDK6-Version / Build (b27) hat der
Scanner
Puffer einen kleineren Puffer ( 1024 Zeichen ) als derBufferedReader
( 8192 Zeichen ), aber er ist mehr als ausreichend.Verwenden
Scanner
Sie für die Auswahl die Option, wenn Sie die Datei analysieren möchten, und die Option ,BufferedReader
wenn Sie die Datei Zeile für Zeile lesen möchten . Siehe auch den Einführungstext der oben verlinkten API-Dokumentationen.nextXxx()
Methoden in derScanner
Klasse.quelle
readInt();
readFloat (); usw. Jetzt habe ich verstanden, was das Parsen bedeutet. und BalusC kannst du mir nur 10 Minuten im Chatraum wenig Zeit geben, ich möchte wenig nach gepuffert fragen, wie es funktioniert.BufferedReader
in Scanners Konstruktor? Ist das eine gute Idee?Scanner
Der Puffer wird nach Bedarf für den Mustervergleich erweitert. Wenn Sie also einen größeren Puffer wünschen, müssen Sie ihn nur aufrufen, z. B.findWithinHorizon("\\z", 8192)
und danach wird ein Puffer mit einer Kapazität von8192
Zeichen verwendet (oder die gesamte Datei, wenn sie kleiner ist).Siehe diesen Link , von dort wird folgendes zitiert:
quelle
BufferedReader
hat deutlich größeren Pufferspeicher als Scanner. VerwendenBufferedReader
Sie diese Option, wenn Sie lange Zeichenfolgen aus einem StreamScanner
abrufen möchten , und verwenden Sie diese Option , wenn Sie einen bestimmten Tokentyp aus einem Stream analysieren möchten.Scanner
Sie können Tokenize mithilfe eines benutzerdefinierten Trennzeichens verwenden und den Stream in primitive Datentypen analysieren, während SieBufferedReader
nur String lesen und speichern können.BufferedReader
ist synchron, währendScanner
nicht. VerwendenBufferedReader
Sie diese Option, wenn Sie mit mehreren Threads arbeiten.Scanner
versteckt die IOException, währendBufferedReader
sie sofort ausgelöst wird .quelle
Ich schlage vor,
BufferedReader
zum Lesen von Text zu verwenden.Scanner
versteckt sich,IOException
währendBufferedReader
es sofort wirft.quelle
Der Unterschied zwischen BufferedReader und Scanner ist folgender:
Code zum Lesen einer Zeile von der Konsole:
BufferedReader :
Scanner :
quelle
Im Folgenden sind die Unterschiede zwischen BufferedReader und Scanner aufgeführt
Vielen Dank
quelle
Die Hauptunterschiede:
Beispiel
druckt die folgende Ausgabe:
Dieselbe Ausgabe kann mit diesem Code generiert werden, der einen regulären Ausdruck verwendet, um alle vier Token gleichzeitig zu analysieren:
BufferedReader:
Liest Text aus einem Zeicheneingabestream und puffert Zeichen, um das effiziente Lesen von Zeichen, Arrays und Zeilen zu ermöglichen.
Die Puffergröße kann angegeben oder die Standardgröße verwendet werden. Die Standardeinstellung ist für die meisten Zwecke groß genug.
Im Allgemeinen bewirkt jede Leseanforderung eines Lesers, dass eine entsprechende Leseanforderung des zugrunde liegenden Zeichens oder Bytestroms gestellt wird. Es ist daher ratsam, einen BufferedReader um jeden Reader zu wickeln, dessen read () -Operationen kostspielig sein können, z. B. FileReaders und InputStreamReaders. Zum Beispiel,
puffert die Eingabe aus der angegebenen Datei. Ohne Pufferung kann jeder Aufruf von read () oder readLine () dazu führen, dass Bytes aus der Datei gelesen, in Zeichen konvertiert und dann zurückgegeben werden, was sehr ineffizient sein kann. Programme, die DataInputStreams für die Texteingabe verwenden, können lokalisiert werden, indem jeder DataInputStream durch einen geeigneten BufferedReader ersetzt wird.
Quelle: Link
quelle
Es gibt verschiedene Möglichkeiten, Eingaben in Java vorzunehmen:
1) BufferedReader 2) Scanner 3) Befehlszeilenargumente
BufferedReader Liest Text aus einem Zeicheneingabestream und puffert Zeichen, um das effiziente Lesen von Zeichen, Arrays und Zeilen zu ermöglichen.
Wobei Scanner ein einfacher Textscanner ist, der primitive Typen und Zeichenfolgen mithilfe regulärer Ausdrücke analysieren kann.
Wenn Sie einen einfachen Protokollleser schreiben, ist ein gepufferter Leser ausreichend. Wenn Sie einen XML-Parser schreiben, ist Scanner die natürlichere Wahl.
Weitere Informationen finden Sie unter:
http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69
quelle
Die folgende Antwort stammt aus Reading from Console: JAVA Scanner vs BufferedReader
Wenn Sie eine Eingabe von der Konsole lesen, gibt es zwei Möglichkeiten, um dies zu erreichen. Erstes Verwenden
Scanner
, ein anderes VerwendenBufferedReader
. Beide haben unterschiedliche Eigenschaften. Es bedeutet Unterschiede, wie man es benutzt.Der Scanner behandelte die angegebene Eingabe als Token. BufferedReader liest nur Zeile für Zeile und gibt die Eingabe als Zeichenfolge ein. Scanner selbst bieten Parsing-Funktionen wie nextInt (), nextFloat ().
Aber was sind andere Unterschiede zwischen?
Scanner kommen mit seit JDK Version 1.5 höher.
Wann sollte Scanner oder Buffered Reader verwendet werden?
Schauen Sie sich die Hauptunterschiede zwischen beiden an, einer mit Token, andere mit Streamline. Wenn Sie Analysefunktionen benötigen, verwenden Sie stattdessen den Scanner. Aber ich fühle mich mit BufferedReader wohler. Wenn Sie aus einer Datei lesen müssen, verwenden Sie BufferedReader, da beim Lesen einer Datei Puffer verwendet wird. Oder Sie können BufferedReader als Eingabe für den Scanner verwenden.
quelle
BufferedReader bietet wahrscheinlich eine bessere Leistung (da der Scanner auf InputStreamReader basiert, siehe Quellen).ups, zum lesen aus dateien wird nio verwendet. Als ich die nio-Leistung gegen die BufferedReader-Leistung für große Dateien getestet habe, zeigt nio eine etwas bessere Leistung.quelle
Ich bevorzuge es,
Scanner
weil es keine geprüften Ausnahmen auslöst und daher die Verwendung zu einem optimierten Code führt.quelle