Java BufferedReader: Slik leser du en fil med eksempel

⚡ Smart oppsummering

Java BufferedReader leser tekst fra en inndatastrøm ved å bufre tegn, noe som gjør linje-for-linje-fillesing rask og enkel.ping en FileReader inni BufferedReader og toalettping på readLine inntil den returnerer null skriver den ut en hel fil.

  • ???? Kjerneformål: BufferedReader pakker inn alle lesere med kostbare leseoperasjoner, noe som reduserer individuelle lesninger mot den underliggende strømmen.
  • 🔁 Les løkke: readLine returnerer én linje per kall og null på slutten av filen, så en while-løkke på det resultatet går gjennom hele filen.
  • 🧱 Unnslippede stier: A Windows stien inne i en Java Strengen trenger en dobbel omvendt skråstrek, ellers avviser kompilatoren den ugyldige escape-sekvensen.
  • ♻️ Ressursutgivelse: Når leseren lukkes, frigjøres den underliggende filhåndtaket; try-with-resources utfører denne lukkingen automatisk.
  • ⌨️ Konsollinngang: Pakkping System.in i en InputStreamReader lar den samme klassen lese tastaturinndata i stedet for en fil.
  • 🇧🇷 Skannerkontrast: BufferedReader er raskere og returnerer rå linjer, mens Scanner analyserer tokener og primitive typer direkte.
  • 🔤 Forsiktig med tegnsett: FileReader bruker standard tegnsett, så å spesifisere et eksplisitt unngår forvrengte tegn på tvers av maskiner.

BufferedReader i Java

Hvordan lese en fil i Java?

Java tilbyr flere mekanismer for å lese fra en fil. Den mest nyttige pakken for dette er java.io, hvis magemusklertract Reader klasse definerer tegnstrømslesing. java.io.BufferedReader er den konkrete underklassen som brukes for effektiv linjebasert lesing.

Hva er BufferedReader i Java?

BufferedReader er en Java klasse som leser tekst fra en inputstrøm, for eksempel en fil, ved å bufre tegn slik at tegn, matriser og linjer leses effektivt. Uten bufring utløser hver leseforespørsel fra en leser en tilsvarende leseforespørsel mot den underliggende tegn- eller bytestrømmen.

Det er derfor lurt å pakke inn BufferedReader rundt enhver Reader hvis read() operasjoner kan være kostbare, som for eksempel FileReader og InputStreamReaderEn typisk bruk sender filbanen til leseren som følger:

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

Dette laster inn filen i objReaderDeretter itererer du gjennom innholdet i filen og skriver ut hver linje. While-løkken i koden nedenfor leser filen til den når slutten av filen.

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

strCurrentLine holder den nåværende linjen, og objReader.readLine() returnerer en streng. Løkken fortsetter derfor å iterere så lenge den returnerte verdien ikke er null, og stopper på den første nullverdien, som signaliserer slutten på filen.

BufferEksempel på edReader

Koden nedenfor er en komplett Java BufferedReader-eksempel:

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();
            }
        }
    }
}

OBS: Ocuco finally blokkerer saker. Det garanterer at objReader.close() kjører uansett om et unntak ble kastet eller ikke, noe som frigir den underliggende filhåndtaket og beholder Minnehåndtering forutsigbar. Det nestede forsøket inni finally er nødvendig fordi close() selv erklærer IOException.

BufferEksempel på edReader JDK7

Fra JDK 7 og utover fjerner try-with-resources finally blokkere helt. Enhver ressurs deklarert i parentesene til try Setningen lukkes automatisk når blokken avsluttes, i omvendt rekkefølge av opprettelsen, selv om et unntak forplanter seg:

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();
        }
    }
}

Denne versjonen er kortere og tryggere, så det er formen man foretrekker i ny kode. Å lese en fil er bare én bruk av klassen; neste avsnitt sammenligner den med alternativet de fleste nybegynnere griper etter først.

BufferedReader vs. skanner: Hvilken skal man bruke

Begge klassene leser tekst, og nybegynnere velger ofte én vilkårlig. De løser forskjellige problemer, og feil valg viser seg enten som klønete manuell parsing eller dårlig gjennomstrømning når inputen vokser til tusenvis av linjer. Tabellen nedenfor setter dem side om side.

Aspekt BufferedReader Skanner
Returer Hele linjer som streng Parsede tokens og primitiver
Innebygd parsing Nei – du splitter eller konverterer deg selv Ja — nesteInt, nesteDouble, neste linje
Standardbuffer 8192 tegn 1024 tegn
Hastighet på store filer Raskere Tregere, på grunn av regex-tokenisering
Trådsikkerhet Synckronisert Ikke synkronisert
Best for Leser store filer linje for linje Liten interaktiv inndata som krever typede verdier

Velg BufferedReader når målet er å raskt navigere gjennom en fil og håndtere teksten selv, og Scanner når du vil ha skrevne verdier uten å skrive konverteringskode. Deler hver returnerte linje med String split-metoden gir BufferedReader mesteparten av skannerens bekvemmelighet med høyere hastighet.

Slik leser du konsollinput ved hjelp av BufferedReader

Den samme klassen leser tastaturinndata, noe som er nyttig for små kommandolinjeprogrammer og for kodeutfordringer. System.in er en bytestrøm, så den kan ikke overleveres til BufferedReader direkte. En InputStreamReader brobygger byte til tegn, og BufferedReader legger deretter til effektiv linjelesing oppå den broen.

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);
        }
    }
}

Tre detaljer er verdt å huske på. For det første, readLine() returnerer alltid en streng, så numerisk input må konverteres med Integer.parseInt eller lignende, og en ikke-numerisk oppføring kaster NumberFormatException — pakker inn konverteringen hvis inndataene ikke er klarerte. For det andre, kaller .trim() fjerner den etterfølgende vognreturen som Windows konsoller legger til, en hyppig årsak til parsefeil. For det tredje, unngå å lukke en leser som er pakket rundt System.in hvis programmet fortsatt trenger konsollinputt senere, fordi lukking av wrapperen lukker den underliggende strømmen permanent for den prosessen.

For programmer som leser mange verdier, er det mye raskere å lese én linje og dele den enn å kalle den opp readLine() gjentatte ganger, siden hvert kall bare krysser inn i operativsystemet når bufferen tømmes. Dette er hovedgrunnen til at konkurrerende programmerere foretrekker BufferedReader over Scanner for masseinndata.

Selv med korrekt kode, dukker det opp en håndfull feil gjentatte ganger.

Felles BufferedReader-feil og hvordan du fikser dem

bro BufferedReader-feil kommer fra filstier, ressurshåndtering eller tegnkoding snarere enn fra selve lesesløyfen. Hver feil nedenfor angir unntaket og løsningen.

  • Ulovlig rømningskarakter: banen bruker en enkel omvendt skråstrek, som i "D:\DukesDiary.txt". Double det også "D:\\DukesDiary.txt", eller bruk en skråstrek, som Java aksepterer på Windows.
  • Filikke funnetUnntak: Stien er relativ til arbeidsmappen, ikke kildefilen. new File(name).getAbsolutePath() å se hvor Java ser faktisk etter.
  • NullPointerException ved første lesing: leseren ble aldri tildelt fordi konstruktøren kastet, og unntaket ble svelget. Sjekk avvikshåndtering før løkken.
  • Uforståelige tegn eller spørsmålstegn: filen er UTF-8, men FileReader brukte plattformens standard tegnsett. Send et tegnsett eksplisitt, for eksempel new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • Strømmen er stengt: Leseren ble lukket inne i løkken eller brukt på nytt etter at try-with-resources var avsluttet. Åpne en ny leser for hver passasje over filen.

Spørsmål og svar

Ja. Et annet konstruktørargument setter bufferen i tegn, for eksempel new BufferedReader(reader, 16384)Standardverdien 8192 passer til de fleste filer; å heve den hjelper bare med svært store sekvensielle lesninger.

For små filer, ja – den returnerer en liste med linjer i ett kall. For store filer foretrekkes Files.newBufferedReader or Files.lines, fordi readAllLines holder hele filen i minnet samtidig.

Ja. AI Assistentene omskriver finally-block cleanup til try-with-resources og foreslår NIO-ekvivalenter. Bekreft tegnsettet og unntaksvirkemåten etterpå, fordi genererte konverteringer ofte dropper den eksplisitte kodingen.

AI leser stakken trace og identifiserer om årsaken er feil arbeidsmappe, manglende tillatelser eller en kodingsavvik. Det forkorter diagnosen, men rettelsen trenger fortsatt verifisering mot den virkelige filen.

Nei. readLine fjerner linjeavslutningen, så en returnert streng inneholder ingen etterfølgende ny linje. En tom linje i filen returnerer derfor en tom streng i stedet for null.

Oppsummer dette innlegget med: