Soll ich den InputStream oder den InputStreamReader puffern?
Was sind die Unterschiede (wenn vorhanden) zwischen den folgenden beiden Pufferung Ansätze?
Reader r1 = new BufferedReader(new InputStreamReader(in, "UTF-8"), bufferSize);
Reader r2 = new InputStreamReader(new BufferedInputStream(in, bufferSize), "UTF-8");
InformationsquelleAutor der Frage bdkosher | 2010-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
r1
effizienter ist. DieInputStreamReader
selbst nicht haben einen großen Puffer. DieBufferedReader
festgelegt werden können, haben einen größeren Puffer alsInputStreamReader
. DieInputStreamReader
imr2
würde als Engpass.In eine Mutter: Sie sollten Lesen Sie die Daten durch einen Trichter, nicht durch eine Flasche.
Update: hier ein kleines benchmark-Programm, nur copy ' N 'Paste' N ' Run. Sie nicht brauchen, um vorzubereiten Dateien.
Ergebnisse bei meinem Latitude E5500 mit einem Seagate Momentus 7200.3 Festplatte:
InformationsquelleAutor der Antwort BalusC
r1
ist auch bequemer, wenn Sie Lesen, line-basiert stream alsBufferedReader
unterstütztreadLine
Methode. Sie nicht zu Lesen, die Inhalte in ein char-array Puffer oder chars. Sie haben jedoch die Besetzungr1
zuBufferedReader
oder mit diesem Typ explizit für die variable.Häufig verwende ich das code-snippet:
InformationsquelleAutor der Antwort pcjuzer
FWIW, wenn Sie die Eröffnung eines Datei in Java 8 verwenden, können Sie die - Dateien.newBufferedReader(Pfad). Ich weiß nicht, wie die performance im Vergleich zu den anderen hier beschriebenen Lösungen, aber wenigstens drückt es die Entscheidung darüber, was zu konstruieren, um Puffer in der JDK.
InformationsquelleAutor der Antwort Max
In der Antwort zu Ross Studtman Frage im Kommentar oben (aber auch relevant für den OP):
Den
BufferedInputStream
ist überflüssig (und wahrscheinlich schadet der Leistung durch irrelevante kopieren). Dies ist, weil dieBufferedReader
Anfragen Charaktere aus derInputStreamReader
in großen Brocken durch den AufrufInputStreamReader.read(char[], int, int)
die wiederum (durchStreamDecoder
) fordertInputStream.read(byte[], int, int)
zu Lesen, einen großen block von bytes aus dem zugrunde liegendenInputStream
.Können Sie sich davon überzeugen, dass dies ist, so dass durch ausführen des folgenden Codes:
Sehen Sie die folgende Ausgabe:
Dies zeigt, dass die
BufferedReader
Anforderungen ein großes Stück der Charaktere aus derInputStreamReader
die wiederum fordert eine große portion an bytes aus der zugrunde liegendenInputStream
.InformationsquelleAutor der Antwort Matt Whitlock