En guide til Java FileReader-klassen

1. Oversigt

Som navnet antyder, FileReader er en Java-klasse, der gør det let at læse indholdet af en fil.

I denne vejledning lærer vi det grundlæggende koncept for a Læser og hvordan vi kan bruge FileReader klasse til at udføre læseoperationer på en tegnstrøm i Java.

2. Læser Grundlæggende

Hvis vi ser på koden til FileReader klasse, så bemærker vi, at klassen indeholder minimal kode til oprettelse af en FileReader objekt og ingen andre metoder.

Dette rejser spørgsmål som "Hvem løfter det tunge løft bag denne klasse?"

For at besvare dette spørgsmål skal vi forstå konceptet og hierarkiet Læser klasse i Java.

Læser er en abstrakt basisklasse, der muliggør læsning af tegn gennem en af ​​dens konkrete implementeringer. Den definerer følgende grundlæggende funktioner til læsning af tegn fra ethvert medium såsom hukommelse eller filsystemet:

  • Læs et enkelt tegn
  • Læs en række tegn
  • Marker og nulstil en given position i en strøm af tegn
  • Spring position over, mens du læser en karakterstrøm
  • Luk inputstrømmen

Naturligvis er alle implementeringer af Læser Klassen skal implementere alle de abstrakte metoder, nemlig Læs() og tæt(). Desuden tilsidesætter de fleste implementeringer også andre nedarvede metoder for at give yderligere funktionalitet eller bedre ydeevne.

2.1. Hvornår skal man bruge en FileReader

Nu hvor vi har en vis forståelse af en Læser, vi er klar til at bringe vores fokus tilbage til FileReader klasse.

FileReader arver dens funktionalitet fra InputStreamReader, som er en Læser implementering designet til at læse bytes fra en inputstrøm som tegn.

Lad os se dette hierarki i klassedefinitionerne:

offentlig klasse InputStreamReader udvider Læser {} offentlig klasse FileReader udvider InputStreamReader {}

Generelt kan vi bruge en InputStreamReader til læsning af tegn fra enhver inputkilde.

Men når det kommer til at læse tekst fra en fil ved hjælp af en InputStreamReader ville være som at skære et æble med et sværd. Naturligvis ville det rigtige værktøj være en kniv, hvilket er netop hvad FileReader løfter.

Vi kan brug en FileReader når vi vil læse tekst fra en fil ved hjælp af systemets standard tegnsæt. For enhver anden avanceret funktionalitet ville det være ideelt til at bruge InputStreamReader klasse direkte.

3. Læsning af en tekstfil med en FileReader

Lad os gennemgå en kodningsøvelse med at læse tegn fra en HelloWorld.txt fil ved hjælp af en FileReader eksempel.

3.1. Oprettelse af en FileReader

Som en bekvemmelighedsklasse FileReader tilbyder tre overbelastede konstruktører der kan bruges til at initialisere en læser, der kan læse fra en fil som en inputkilde.

Lad os se på disse konstruktører:

offentlig FileReader (String filnavn) kaster FileNotFoundException {super (ny FileInputStream (filnavn)); } offentlig FileReader (filfil) kaster FileNotFoundException {super (ny FileInputStream (fil)); } offentlig FileReader (FileDescriptor fd) {super (ny FileInputStream (fd)); }

I vores tilfælde kender vi filnavnet på inputfilen. Derfor kan vi bruge den første konstruktør til at initialisere en læser:

FileReader fileReader = ny FileReader (sti);

3.2. Læsning af et enkelt tegn

Lad os derefter oprette readAllCharactersOneByOne (), en metode til læsning af tegn fra filen en ad gangen:

public static String readAllCharactersOneByOne (Reader reader) kaster IOException {StringBuilder content = new StringBuilder (); int nextChar; mens ((nextChar = reader.read ())! = -1) {content.append ((char) nextChar); } returner String.valueOf (indhold); }

Som vi kan se fra ovenstående kode, har vi brugteLæs() metode i en løkke for at læse tegn en efter en, indtil den returnerer -1, hvilket betyder at der ikke er flere tegn at læse.

Lad os nu teste vores kode ved at validere, at teksten, der læses fra filen, matcher den forventede tekst:

@Test offentlig ugyldighed givenFileReader_whenReadAllCharacters_thenReturnsContent () kaster IOException {String expectText = "Hej verden!"; Filfil = ny fil (FILE_PATH); prøv (FileReader fileReader = ny FileReader (fil)) {String indhold = FileReaderExample.readAllCharactersOneByOne (fileReader); Assert.assertEquals (forventet tekst, indhold); }}

3.3. Læsning af en række karakterer

Vi kan endda læse flere tegn på én gang ved hjælp af det arvede læse (char cbuf [], int off, int len) metode:

offentlig statisk String readMultipleCharacters (Læserlæser, int længde) kaster IOException {char [] buffer = ny char [længde]; int charactersRead = reader.read (buffer, 0, længde); if (charactersRead! = -1) {returner ny streng (buffer, 0, charactersRead); } andet {return ""; }}

Der er en subtil forskel i returværdien af Læs() når det kommer til at læse flere tegn i en matrix. Det returværdi her er enten antallet af læste tegn eller -1 hvis læseren har nået slutningen af ​​inputstrømmen.

Lad os derefter teste rigtigheden af ​​vores kode:

@Test offentlig ugyldighed givenFileReader_whenReadMultipleCharacters_thenReturnsContent () kaster IOException {String expectText = "Hej"; Filfil = ny fil (FILE_PATH); prøv (FileReader fileReader = ny FileReader (fil)) {String indhold = FileReaderExample.readMultipleCharacters (fileReader, 5); Assert.assertEquals (forventet tekst, indhold); }}

4. Begrænsninger

Vi har set, at FileReader klasse er afhængig af standard systemtegnkodning.

Så for situationer, hvor vi har brug for brugerdefinerede værdier for tegnsættet, bufferstørrelsen eller inputstrømmen skal vi brug InputStreamReader.

Desuden ved vi alle, at I / O-cyklusser er dyre og kan introducere latenstid til vores applikation. Så det er i vores bedste interesse at minimer antallet af I / O-operationer ved at indpakke a BufferedReader omkring vores FileReader objekt:

BufferedReader in = ny BufferedReader (fileReader);

5. Konklusion

I denne vejledning lærte vi om de grundlæggende begreber i Læser og hvor FileReader gør det simpelt at udføre læsning på tekstfiler gennem nogle eksempler.

Som altid er den komplette kildekode til vejledningen tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found