Java BufferedReader: So lesen Sie eine Datei mit Beispiel

⚡ Intelligente Zusammenfassung

Java BufferedReader liest Text aus einem Eingabestrom, indem es Zeichen zwischenspeichert. Dadurch wird das zeilenweise Lesen von Dateien schnell und einfach.ping ein FileReader innerhalb BufferedReader und looping on readLine until it returns null gibt eine gesamte Datei aus.

  • ???? Hauptzweck: BufferedReader umschließt jeden Reader, dessen Leseoperationen aufwändig sind, und reduziert so die Anzahl der einzelnen Lesevorgänge im zugrunde liegenden Datenstrom.
  • 🔁 Leseschleife: readLine gibt pro Aufruf eine Zeile zurück und am Ende der Datei null. Eine while-Schleife, die auf diesem Ergebnis basiert, durchläuft die gesamte Datei.
  • 🧱 Entkommene Wege: A Windows Pfad innerhalb eines Java Die Zeichenkette benötigt einen doppelten Backslash, andernfalls lehnt der Compiler die ungültige Escape-Sequenz ab.
  • ♻️ Ressourcenfreigabe: Durch das Schließen des Readers wird der zugrunde liegende Dateihandle freigegeben; try-with-resources führt dieses Schließen automatisch durch.
  • Konsoleneingabe: einwickelnping System.in in einem InputStreamReader ermöglicht es derselben Klasse, Tastatureingaben anstatt einer Datei zu lesen.
  • Scannerkontrast: BufferedReader ist schneller und gibt Rohzeilen zurück, während Scanner Token und primitive Datentypen direkt analysiert.
  • 🔤 Zeichensatz-Vorsicht: FileReader verwendet den Standardzeichensatz; durch die explizite Angabe eines Zeichensatzes lassen sich Darstellungsfehler auf verschiedenen Rechnern vermeiden.

BufferedReader in Java

So lesen Sie eine Datei in Java?

Java bietet verschiedene Mechanismen zum Lesen aus einer Datei. Das nützlichste Paket hierfür ist java.io, dessen Bauchmuskelntract Reader Die Klasse definiert das Lesen von Zeichenströmen. java.io.BufferedReader ist die konkrete Unterklasse, die für effizientes zeilenbasiertes Lesen verwendet wird.

Was ist BufferedReader in Java?

BufferedReader ist eine Java Eine Klasse, die Text aus einem Eingabestrom, beispielsweise einer Datei, liest, indem sie Zeichen zwischenspeichert, um ein effizientes Lesen von Zeichen, Arrays und Zeilen zu ermöglichen. Ohne Zwischenspeicherung würde jede Leseanforderung eines Readers eine entsprechende Leseanforderung an den zugrunde liegenden Zeichen- oder Byte-Stream auslösen.

Es empfiehlt sich daher das Einwickeln BufferedReader um jeden Leser herum, dessen read() Die Operationen können kostspielig sein, wie zum Beispiel FileReader und InputStreamReaderEine typische Verwendung übergibt den Dateipfad wie folgt an den Reader:

// Note the doubled backslash: a single \ starts an escape sequence
objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));

Dadurch wird die Datei geladen in objReaderAnschließend durchlaufen Sie den Inhalt der Datei und geben jede Zeile aus. Die while-Schleife im folgenden Code liest die Datei, bis sie das Dateiende erreicht.

while ((strCurrentLine = objReader.readLine()) != null) {
    System.out.println(strCurrentLine);
}

strCurrentLine hält die aktuelle Leitung, und objReader.readLine() Gibt einen String zurück. Die Schleife wird daher so lange wiederholt, wie der zurückgegebene Wert nicht null ist, und stoppt beim ersten Nullwert, der das Dateiende signalisiert.

BufferedReader-Beispiel

Der unten stehende Code ist vollständig. Java BufferedReader-Beispiel:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileExample {

    public static void main(String[] args) {
        BufferedReader objReader = null;
        try {
            String strCurrentLine;

            objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));

            while ((strCurrentLine = objReader.readLine()) != null) {
                System.out.println(strCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (objReader != null)
                    objReader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

Hinweis: Das finally Block ist wichtig. Es garantiert, dass objReader.close() Wird unabhängig davon ausgeführt, ob eine Ausnahme ausgelöst wurde, wodurch der zugrunde liegende Dateihandle freigegeben und beibehalten wird. Speicherverwaltung Vorhersehbar. Der verschachtelte try-Block innerhalb finally ist erforderlich, weil close() selbst erklärt IOException.

BufferedReader JDK7-Beispiel

Ab JDK 7 entfernt try-with-resources die finally Blockiert vollständig. Jede Ressource, die in den Klammern deklariert ist try Die Anweisung wird beim Verlassen des Blocks automatisch in umgekehrter Reihenfolge ihrer Erstellung geschlossen, selbst wenn eine Ausnahme weitergegeben wird:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileExample_jdk7 {

    private static final String FILENAME = "D:\\DukesDiary.txt";

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) {

            String strCurrentLine;

            while ((strCurrentLine = br.readLine()) != null) {
                System.out.println(strCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Diese Version ist kürzer und sicherer und sollte daher in neuem Code bevorzugt werden. Das Lesen einer Datei ist nur eine Anwendungsmöglichkeit der Klasse; im nächsten Abschnitt wird sie mit der Alternative verglichen, zu der die meisten Anfänger zuerst greifen.

BufferedReader vs. Scanner: Welchen sollte man verwenden?

Beide Klassen lesen Texte, und Anfänger wählen oft willkürlich eine aus. Sie lösen unterschiedliche Probleme, und die falsche Wahl äußert sich entweder in umständlichem manuellem Parsen oder in geringem Durchsatz, sobald die Eingabe Tausende von Zeilen umfasst. Die folgende Tabelle vergleicht sie gegenüber.

Aspekt BufferedReader Scanner
Rücksendungen Ganze Zeilen als Zeichenkette Geparste Token und Primitive
Parsing integriert Nein – du spaltest dich oder konvertierst dich selbst Ja – nextInt, nextDouble, nächsteZeile
Standardpuffer 8192 Zeichen 1024 Zeichen
Geschwindigkeit bei großen Dateien Schneller Langsamer aufgrund der Tokenisierung mit regulären Ausdrücken.
Gewindesicherheit Syncchronisiert Nicht synchronisiert
am besten für Große Dateien Zeile für Zeile lesen Kleine interaktive Eingabe, die eingegebene Werte erfordert

Wählen BufferedReader eignet sich, wenn es darum geht, schnell durch eine Datei zu navigieren und den Text selbst zu verarbeiten, und Scanner, wenn Sie eingegebene Werte benötigen, ohne Konvertierungscode schreiben zu müssen. Jede zurückgegebene Zeile wird mit dem String-Split-Methode gibt BufferedReader bietet die meisten Vorteile eines Scanners bei höherer Geschwindigkeit.

Wie man Konsoleneingaben liest BufferedReader

Dieselbe Klasse liest auch Tastatureingaben, was für kleine Kommandozeilenprogramme und für Eingaben bei Programmieraufgaben nützlich ist. System.in ist ein Bytestrom, daher kann er nicht übergeben werden an BufferedReader direkt. Ein InputStreamReader Überbrückt Bytes zu Zeichen und BufferedReader ergänzt diese Brücke dann um ein effizientes Zeilenlesen.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadConsoleExample {

    public static void main(String[] args) throws IOException {

        // Bridge the System.in byte stream to a character stream
        try (BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in))) {

            System.out.print("Enter your name: ");
            String name = reader.readLine();

            System.out.print("Enter your age: ");
            // readLine always returns text, so convert it explicitly
            int age = Integer.parseInt(reader.readLine().trim());

            System.out.println("Hello " + name + ", age " + age);
        }
    }
}

Drei Details sind es wert, beachtet zu werden. Erstens: readLine() gibt immer einen String zurück, daher müssen numerische Eingaben mit Integer.parseInt oder Ähnliches, und eine nicht-numerische Eingabe wirft NumberFormatException — Die Konvertierung wird abgebrochen, wenn die Eingabe nicht vertrauenswürdig ist. Zweitens: Aufruf .trim() entfernt den nachfolgenden Zeilenumbruch, Windows Konsolen fügen Code hinzu, was häufig zu Analysefehlern führt. Drittens: Vermeiden Sie es, einen umschlossenen Reader zu schließen. System.in falls das Programm später noch Konsoleneingaben benötigt, da das Schließen des Wrappers den zugrunde liegenden Datenstrom für diesen Prozess dauerhaft schließt.

Bei Programmen, die viele Werte lesen, ist das Lesen einer Zeile und deren Aufteilung wesentlich schneller als der Aufruf von readLine() wiederholt, da jeder Aufruf das Betriebssystem erst dann erreicht, wenn der Puffer leer ist. Dies ist der Hauptgrund, warum Wettbewerbsprogrammierer diese Methode bevorzugen. BufferedReader statt Scanner für die Masseneingabe.

Selbst bei korrektem Code treten einige Fehler immer wieder auf.

gemeinsam BufferedReader-Fehler und wie man sie behebt

Most BufferFehler in edReader entstehen durch Dateipfade, Ressourcenverwaltung oder Zeichenkodierung und nicht durch die Leseschleife selbst. Jeder Fehler wird unten mit seiner Ausnahme und der entsprechenden Lösung aufgeführt.

  • Ungültiges Escape-Zeichen: Der Pfad verwendet einen einzelnen Backslash, wie in "D:\DukesDiary.txt". Double es "D:\\DukesDiary.txt"oder verwenden Sie einen Schrägstrich, Java akzeptiert auf Windows.
  • FileNotFoundException: Der Pfad ist relativ zum Arbeitsverzeichnis, nicht zur Quelldatei. Drucken new File(name).getAbsolutePath() um zu sehen wo Java schaut tatsächlich.
  • NullPointerException beim ersten Lesevorgang: Der Reader konnte nie zugewiesen werden, da der Konstruktor eine Ausnahme auslöste, die abgefangen wurde. Überprüfen Sie die Ausnahmebehandlung vor der Schleife.
  • Unleserliche oder Fragezeichenzeichen: Die Datei ist UTF-8-kodiert, aber FileReader Der Standardzeichensatz der Plattform wurde angewendet. Geben Sie einen Zeichensatz explizit an, zum Beispiel new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • Stream geschlossen: Der Reader wurde innerhalb der Schleife geschlossen oder nach Beendigung von try-with-resources wiederverwendet. Öffnen Sie für jeden Durchlauf der Datei einen neuen Reader.

Häufig gestellte Fragen

Ja. Ein zweites Konstruktorargument legt den Puffer in Zeichen fest, zum Beispiel new BufferedReader(reader, 16384)Der Standardwert von 8192 ist für die meisten Dateien geeignet; eine Erhöhung hilft nur bei sehr großen sequenziellen Lesevorgängen.

Für kleine Dateien ja – es gibt eine Liste von Zeilen in einem Aufruf zurück. Für große Dateien bevorzugen Sie Files.newBufferedReader or Files.lines, weil readAllLines die gesamte Datei auf einmal im Speicher hält.

Ja. AI Assistenten schreiben die Aufräumarbeiten im finally-Block in try-with-resources um und schlagen NIO-Äquivalente vor. Überprüfen Sie anschließend den Zeichensatz und das Ausnahmeverhalten, da generierte Konvertierungen die explizite Kodierung oft weglassen.

Die KI liest den Stapel tracEs ermittelt, ob die Ursache ein falsches Arbeitsverzeichnis, fehlende Berechtigungen oder ein Kodierungsfehler ist. Dies verkürzt die Diagnosezeit, die Lösung muss jedoch weiterhin anhand der Originaldatei überprüft werden.

Nein. `readLine` entfernt das Zeilenumbruchzeichen, sodass der zurückgegebene String keinen nachfolgenden Zeilenumbruch enthält. Eine leere Zeile in der Datei gibt daher einen leeren String und nicht `null` zurück.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: