BufferedReader (Gepufferte Eingabe)
Kurz: Ein Wrapper um einen Eingabe-Stream, der Daten in einem Zwischenspeicher (Puffer) sammelt und Lesezugriffe dadurch deutlich beschleunigt, statt bei jedem einzelnen Zeichen direkt auf die eigentliche Quelle (Datei, Netzwerk) zuzugreifen.
Genauer: Statt jedes Zeichen einzeln von der Festplatte oder aus dem Netzwerk zu holen (langsam, viele einzelne Systemaufrufe), liest ein gepufferter Reader größere Blöcke auf einmal in den Speicher und gibt Zeichen oder Zeilen daraus zurück — oft mit einer bequemen Methode, um eine ganze Zeile auf einmal zu lesen. Das Gegenstück für die Schreibrichtung ist die gepufferte Ausgabe.
Im Detail
BufferedReader reader = new BufferedReader(new FileReader("datei.txt"));
String zeile;
while ((zeile = reader.readLine()) != null) {
verarbeite(zeile);
}
reader.close();Die naheliegendste zusätzliche Bequemlichkeit eines BufferedReader gegenüber einem rohen Eingabe-Stream ist die readLine()-Methode: Sie liefert eine komplette Textzeile auf einmal, statt dass der aufrufende Code selbst nach Zeilenumbrüchen suchen muss — ein reiner Byte- oder Zeichen-Stream kennt das Konzept “Zeile” gar nicht, das ist eine Interpretation, die erst der BufferedReader hinzufügt.
Intern funktioniert das Puffern so: Beim ersten Lesezugriff holt der BufferedReader NICHT nur das eine angeforderte Zeichen, sondern gleich einen ganzen Block (typischerweise mehrere Kilobyte) aus der darunterliegenden Quelle und legt ihn in einem internen Array ab. Alle nachfolgenden Lesezugriffe werden — solange noch Daten im Puffer vorhanden sind — direkt aus diesem Array bedient, ohne die eigentliche, langsamere Quelle erneut anzusprechen. Erst wenn der Puffer leer ist, wird der nächste Block nachgeladen.
Das Prinzip ist analog zum Einkaufen: Statt für jeden einzelnen Artikel eine separate Fahrt zum Supermarkt zu machen (jeweils ein einzelner, teurer Lesezugriff), kauft man einmal einen ganzen Wagen voll (ein großer, effizienter Blocklesezugriff) und entnimmt zu Hause bei Bedarf einzelne Artikel daraus (schnelle Zugriffe aus dem lokalen Puffer).
Ohne Pufferung wäre besonders zeilenweises Verarbeiten großer Textdateien extrem langsam, weil jedes einzelne Zeichen (oder zumindest jeder Aufruf) potenziell einen teuren Zugriff auf die eigentliche Quelle auslösen könnte. Deshalb wird ein roher Datei-Stream in der Praxis so gut wie immer mit einem gepufferten Wrapper kombiniert, sobald mehr als ein paar einzelne Werte gelesen werden sollen.
Siehe auch: I/O Streams, BufferedWriter, Read Files