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.

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
FileReaderanvendte platformens standardtegnsæt. Send et tegnsæt eksplicit, for eksempelnew 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.
