En guide til Java FileReader-klassen

1. Oversikt

Som navnet antyder, FileReader er en Java-klasse som gjør det enkelt å lese innholdet i en fil.

I denne opplæringen lærer vi det grunnleggende konseptet med a Leser og hvordan vi kan bruke FileReader klasse for å gjøre leseoperasjoner på en tegnstrøm i Java.

2. Leser Grunnleggende

Hvis vi ser på koden til FileReader klasse, så merker vi at klassen inneholder minimal kode for å lage en FileReader objekt og ingen andre metoder.

Dette reiser spørsmål som "Hvem løfter tungt bak denne timen?"

For å svare på dette spørsmålet, må vi forstå konseptet og hierarkiet til Leser klasse i Java.

Leser er en abstrakt basisklasse som gjør lesing av tegn mulig gjennom en av dens konkrete implementeringer. Den definerer følgende grunnleggende operasjoner for å lese tegn fra hvilket som helst medium som minne eller filsystem:

  • Les et enkelt tegn
  • Les en rekke tegn
  • Merk og tilbakestill en gitt posisjon i en strøm av tegn
  • Hopp over posisjon mens du leser en tegnstrøm
  • Lukk inngangsstrømmen

Naturligvis er alle implementeringene av Leser klassen må implementere alle de abstrakte metodene, nemlig lese() og Lukk(). Videre overstyrer de fleste implementeringer også andre nedarvede metoder for å gi ekstra funksjonalitet eller bedre ytelse.

2.1. Når skal du bruke en FileReader

Nå som vi har forståelse for en Leser, vi er klare til å bringe fokus tilbake til FileReader klasse.

FileReader arver funksjonaliteten fra InputStreamReader, hvilken er en Leser implementering designet for å lese byte fra en inngangsstrøm som tegn.

La oss se dette hierarkiet i klassedefinisjonene:

offentlig klasse InputStreamReader utvider Reader {} offentlig klasse FileReader utvider InputStreamReader {}

Generelt kan vi bruke en InputStreamReader for å lese tegn fra hvilken som helst inngangskilde.

Imidlertid når det gjelder å lese tekst fra en fil, ved hjelp av en InputStreamReader ville være som å skjære et eple med sverd. Selvfølgelig vil det rette verktøyet være en kniv, som er nettopp hva FileReader lover.

Vi kan bruk en FileReader når vi vil lese tekst fra en fil ved hjelp av systemets standard tegnsett. For enhver annen avansert funksjonalitet, vil det være ideelt for bruk av InputStreamReader klasse direkte.

3. Lese en tekstfil med en FileReader

La oss gå gjennom en kodeøvelse med å lese tegn fra en HelloWorld.txt fil ved hjelp av en FileReader forekomst.

3.1. Opprette en FileReader

Som en komfortklasse, FileReader tilbyr tre overbelastede konstruktører som kan brukes til å initialisere en leser som kan lese fra en fil som inndatakilde.

La oss ta en titt på disse konstruktørene:

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

I vårt tilfelle kjenner vi filnavnet til inndatafilen. Derfor kan vi bruke den første konstruktøren til å initialisere en leser:

FileReader fileReader = ny FileReader (bane);

3.2. Lese et enkelt tegn

La oss deretter lage readAllCharactersOneByOne (), en metode for å lese tegn fra filen en om gangen:

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

Som vi kan se fra koden ovenfor, har vi bruktelese() metode i en løkke for å lese tegn en etter en til den returnerer -1, noe som betyr at det ikke er flere tegn å lese.

La oss nå teste koden vår ved å validere at teksten som er lest fra filen samsvarer med forventet tekst:

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

3.3. Lesing av en serie av tegn

Vi kan til og med lese flere tegn samtidig ved hjelp av arvet lese (char cbuf [], int av, int len) metode:

public static String readMultipleCharacters (Reader reader, int length) kaster IOException {char [] buffer = new char [length]; int charactersRead = reader.read (buffer, 0, lengde); if (charactersRead! = -1) {return new String (buffer, 0, charactersRead); } annet {return ""; }}

Det er en subtil forskjell i returverdien av lese() når det gjelder å lese flere tegn i en matrise. De returverdien her er enten antall tegn som er lest eller -1 hvis leseren har nådd slutten av inngangsstrømmen.

La oss deretter teste korrektheten av koden vår:

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

4. Begrensninger

Vi har sett at FileReader klasse er avhengig av standard systemtegnkoding.

Så for situasjoner, der vi trenger å bruke tilpassede verdier for tegnsett, bufferstørrelse eller inngangsstrøm, må vi bruk InputStreamReader.

Videre vet vi alle at I / O-sykluser er dyre og kan introdusere ventetid for applikasjonen vår. Så det er i vår beste interesse å minimere antall I / O-operasjoner ved å pakke inn a BufferedReader rundt vår FileReader gjenstand:

BufferedReader in = ny BufferedReader (fileReader);

5. Konklusjon

I denne opplæringen lærte vi om de grunnleggende konseptene til a Leser og hvordan FileReader gjør det enkelt å gjøre leseoperasjoner på tekstfiler, men noen eksempler.

Som alltid er den komplette kildekoden for opplæringen tilgjengelig på GitHub.