Java BufferedReader: Sådan læser du en fil med eksempel

⚡ Smart opsummering

Java BufferedReader læser tekst fra en inputstrøm ved at buffere tegn, hvilket gør linje-for-linje-fillæsning hurtig og enkel.ping en FileReader indeni BufferedReader og toiletping på readLine indtil den returnerer null udskriver en hel fil.

  • ???? Kerneformål: BufferedReader ombryder enhver læser, hvis læseoperationer er dyre, hvilket reducerer individuelle læsninger mod den underliggende strøm.
  • 🔁 Læs løkke: readLine returnerer én linje pr. kald og null i slutningen af ​​filen, så en while-løkke på det resultat gennemgår hele filen.
  • 🧱 Undgåede stier: A Windows sti indeni en Java Strengen skal have et fordoblet omvendt skråstreg, ellers afviser compileren den ugyldige escape-sekvens.
  • ♻️ Ressourcefrigivelse: Lukning af læseren frigiver den underliggende filhandle; try-with-resources udfører denne lukning automatisk.
  • ⌨️ Konsolindgang: Wrapping System.in i en InputStreamReader lader den samme klasse læse tastaturinput i stedet for en fil.
  • ⚖️ Scannerkontrast: BufferedReader er hurtigere og returnerer rå linjer, mens Scanner analyserer tokens og primitive typer direkte.
  • 🔤 Forsigtig med tegnsæt: FileReader anvender standardtegnsættet, så hvis du eksplicit angiver et, undgår du forvrængede tegn på tværs af maskiner.

BufferedReader i Java

Sådan læser du en fil Java?

Java tilbyder adskillige mekanismer til at læse fra en fil. Den mest nyttige pakke til dette er java.io, hvis mavemusklertract Reader klasse definerer tegnstrømslæsning. java.io.BufferedReader er den konkrete underklasse, der bruges til effektiv linjebaseret læsning.

Hvad er BufferedReader i Java?

BufferedReader er en Java klasse, der læser tekst fra en inputstrøm, f.eks. en fil, ved at buffere tegn, så tegn, arrays og linjer læses effektivt. Uden buffering udløser hver læseanmodning fra en læser en tilsvarende læseanmodning mod den underliggende tegn- eller bytestrøm.

Det er derfor tilrådeligt at pakke ind BufferedReader omkring enhver Reader, hvis read() operationer kan være dyre, som f.eks. FileReader og InputStreamReaderEn typisk brug sender filstien til læseren som følger:

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

Dette indlæser filen i objReaderDerefter itererer du gennem indholdet af filen og udskriver hver linje. While-løkken i koden nedenfor læser filen, indtil den når slutningen af ​​filen.

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

strCurrentLine holder den nuværende linje, og objReader.readLine() returnerer en streng. Løkken fortsætter derfor med at iterere, så længe den returnerede værdi ikke er nul, og stopper ved den første nulværdi, hvilket signalerer slutningen af ​​filen.

BufferEksempel på edReader

Koden nedenfor er en komplet 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();
            }
        }
    }
}

Bemærk: finally blokerer. Det garanterer, at objReader.close() kører uanset om der blev kastet en undtagelse eller ej, hvilket frigiver den underliggende filhandle og gemmer hukommelsesstyring forudsigelig. Det indbyggede forsøg indeni finally er påkrævet fordi close() selv erklærer IOException.

BufferEksempel på edReader JDK7

Fra JDK 7 og frem fjerner try-with-resources finally blok helt. Enhver ressource, der er deklareret i parentesen til try Sætningen lukkes automatisk, når blokken afsluttes, i omvendt rækkefølge af oprettelsen, selvom en undtagelse udbredes:

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 version er kortere og sikrere, så det er den form, man foretrækker i ny kode. Læsning af en fil er kun én anvendelse af klassen; det næste afsnit sammenligner den med det alternativ, som de fleste begyndere først griber an.

BufferedReader vs. Scanner: Hvilken skal man bruge

Begge klasser læser tekst, og begyndere vælger ofte én vilkårligt. De løser forskellige problemer, og det forkerte valg viser sig enten som klodset manuel parsing eller dårlig gennemløbshastighed, når inputtet vokser til tusindvis af linjer. Tabellen nedenfor viser dem side om side.

Aspect BufferedReader Scanner
Returpolitik Hele linjer som streng Parsede tokens og primitiver
Indbygget parsing Nej — du splitter eller konverterer dig selv Ja — næsteInt, næsteDouble, næste linje
Standardbuffer 8192 tegn 1024 tegn
Hastighed på store filer Hurtigere Langsommere på grund af regex-tokenisering
Trådsikkerhed Synckroniseret Ikke synkroniseret
Bedste for Læsning af store filer linje for linje Lille interaktiv input, der kræver indtastede værdier

Vælg BufferedReader, når målet er at navigere hurtigt gennem en fil og håndtere teksten selv, og Scanner, når du ønsker indtastede værdier uden at skrive konverteringskode. Opdeling af hver returnerede linje med String split-metoden giver BufferedReader meste af scannerens bekvemmelighed ved højere hastighed.

Sådan læser du konsolinput ved hjælp af BufferedReader

Den samme klasse læser tastaturinput, hvilket er nyttigt til små kommandolinjeprogrammer og til input med kodeudfordringer. System.in er en bytestrøm, så den kan ikke overføres til BufferedReader direkte. En InputStreamReader brobygger bytes til tegn, og BufferedReader tilføjer derefter effektiv linjelæsning oven på den bro.

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 værd at huske. For det første, readLine() returnerer altid en streng, så numerisk input skal konverteres med Integer.parseInt eller lignende, og en ikke-numerisk indtastning kaster NumberFormatException — ombryd konverteringen, hvis inputtet ikke er tillidsfuldt. For det andet, kald .trim() fjerner den efterfølgende linjeretur, der Windows konsoller tilføjes, en hyppig årsag til parse-fejl. For det tredje, undgå at lukke en læser, der er pakket ind omkring System.in hvis programmet stadig har brug for konsolinput senere, fordi lukning af wrapperen lukker den underliggende strøm permanent for den proces.

For programmer, der læser mange værdier, er det langt hurtigere at læse én linje og opdele den end at kalde den. readLine() gentagne gange, da hvert kald kun krydser operativsystemet, når bufferen tømmes. Dette er hovedårsagen til, at konkurrencedygtige programmører foretrækker BufferedReader over Scanner til masseinput.

Selv med korrekt kode opstår der gentagne gange en håndfuld fejl.

Fælles BufferedReader-fejl og hvordan man retter dem

bro BufferedReader-fejl skyldes filstier, ressourcehåndtering eller tegnkodning snarere end selve læseløkken. Hver fejl nedenfor angiver dens undtagelse og dens rettelse.

  • Ulovlig flugtkarakter: Stien bruger et enkelt omvendt skråstreg, som i "D:\DukesDiary.txt". Double det til "D:\\DukesDiary.txt", eller brug et skråstreg, hvilket Java accepterer den Windows.
  • FilikkefundetUndtagelse: Stien er relativ i forhold til arbejdsmappen, ikke kildefilen. Udskriv new File(name).getAbsolutePath() at se hvor Java kigger faktisk.
  • NullPointerException ved første læsning: Læseren blev aldrig tildelt, fordi konstruktøren kastede, og undtagelsen blev opslugt. Tjek undtagelse håndtering før løkken.
  • Forvrængede tegn eller spørgsmålstegn: Filen er UTF-8, men FileReader anvendte platformens standardtegnsæt. Send et tegnsæt eksplicit, for eksempel new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • Strøm lukket: Læseren blev lukket inde i løkken eller genbrugt efter at try-with-resources var afsluttet. Åbn en ny læser for hver gennemgang af filen.

Ofte Stillede Spørgsmål

Ja. Et andet konstruktørargument angiver bufferen i tegn, for eksempel new BufferedReader(reader, 16384)Standardværdien 8192 passer til de fleste filer; at hæve den hjælper kun med meget store sekventielle læsninger.

For små filer, ja — den returnerer en liste over linjer i ét kald. For store filer foretrækkes Files.newBufferedReader or Files.lines, fordi readAllLines gemmer hele filen i hukommelsen på én gang.

Ja. AI Assistenter omskriver finally-block cleanup til try-with-resources og foreslår NIO-ækvivalenter. Bekræft tegnsættet og undtagelsesadfærden bagefter, da genererede konverteringer ofte dropper den eksplicitte kodning.

AI læser stakken trace og identificerer, om årsagen er en forkert arbejdsmappe, manglende tilladelser eller en kodningsfejl. Det forkorter diagnosen, selvom rettelsen stadig skal verificeres mod den rigtige fil.

Nej. readLine fjerner linjeafslutningen, så en returneret streng indeholder ingen efterfølgende linjeskift. En tom linje i filen returnerer derfor en tom streng i stedet for null.

Opsummer dette indlæg med: