Vodič za klasu Java FileReader

1. Pregled

Kao što i samo ime govori, Čitač datoteka je Java klasa koja olakšava čitanje sadržaja datoteke.

U ovom uputstvu naučit ćemo osnovni koncept a Čitač i kako možemo koristiti Čitač datoteka klasa za izvršavanje operacija čitanja na toku znakova u Javi.

2. Čitač Osnove

Ako pogledamo kod Čitač datoteka razreda, tada ćemo primijetiti da klasa sadrži minimalni kôd za stvaranje a Čitač datoteka objekt i nikakve druge metode.

To postavlja pitanja poput "Tko diže teško iza ovog razreda?"

Da bismo odgovorili na ovo pitanje, moramo razumjeti koncept i hijerarhiju Čitač razred u Javi.

Čitač je apstraktna osnovna klasa koja omogućuje čitanje znakova kroz jednu od njegovih konkretnih implementacija. Definira sljedeće osnovne operacije čitanja znakova s ​​bilo kojeg medija, poput memorije ili datotečnog sustava:

  • Pročitajte jedan znak
  • Pročitajte niz znakova
  • Označite i resetirajte zadani položaj u toku znakova
  • Preskočite položaj dok čitate tok znakova
  • Zatvorite ulazni tok

Naravno, sve implementacije Čitač klasa mora implementirati sve apstraktne metode, naime čitati() i Zatvoriti(). Štoviše, većina implementacija također nadjačava druge naslijeđene metode kako bi se dobila dodatna funkcionalnost ili bolje performanse.

2.1. Kada koristiti a Čitač datoteka

Sad kad smo se malo razumjeli o a Čitač, spremni smo vratiti svoj fokus na Čitač datoteka razred.

Čitač datoteka nasljeđuje svoju funkcionalnost od InputStreamReader, što je a Čitač implementacija dizajnirana za čitanje bajtova iz ulaznog toka kao znakova.

Pogledajmo ovu hijerarhiju u definicijama klasa:

javna klasa InputStreamReader proširuje Reader {} javna klasa FileReader proširuje InputStreamReader {}

Općenito, možemo koristiti InputStreamReader za čitanje znakova iz bilo kojeg ulaznog izvora.

Međutim, kada je riječ o čitanju teksta iz datoteke, pomoću InputStreamReader bilo bi poput rezanja jabuke mačem. Naravno, pravi alat bio bi nož, što je upravo ono Čitač datoteka obećanja.

Možemo koristi Čitač datoteka kada želimo čitati tekst iz datoteke pomoću zadanog skupa znakova sustava. Za bilo koju drugu naprednu funkcionalnost bilo bi idealno za korištenje InputStreamReader razred izravno.

3. Čitanje tekstualne datoteke pomoću a Čitač datoteka

Prođimo kroz vježbu kodiranja čitanja znakova iz a HelloWorld.txt datoteku pomoću Čitač datoteka primjer.

3.1. Stvaranje a Čitač datoteka

Kao praktični razred, Čitač datoteka nudi tri preopterećena konstruktora koji se može koristiti za inicijalizaciju čitača koji može čitati iz datoteke kao ulazni izvor.

Pogledajmo ove konstruktore:

javni FileReader (string fileName) baca FileNotFoundException {super (novi FileInputStream (fileName)); } javni FileReader (datoteka datoteke) baca FileNotFoundException {super (novi FileInputStream (datoteka)); } javni FileReader (FileDescriptor fd) {super (novi FileInputStream (fd)); }

U našem slučaju znamo naziv datoteke ulazne datoteke. Slijedom toga, prvi konstruktor možemo koristiti za inicijalizaciju čitača:

FileReader fileReader = novi FileReader (put);

3.2. Čitanje jednog lika

Dalje, kreirajmo readAllCharactersOneByOne (), metoda za čitanje znakova iz datoteke jedan po jedan:

javni statički niz readAllCharactersOneByOne (čitač čitača) baca IOException {StringBuilder content = new StringBuilder (); int nextChar; while ((nextChar = reader.read ())! = -1) {content.append ((char) nextChar); } return String.valueOf (content); }

Kao što vidimo iz gornjeg koda, jesmo koristiočitati() metoda u petlji za čitanje znakova jedan po jedan sve dok se ne vrati -1, što znači da više nema znakova za čitanje.

Sada, testirajmo naš kôd provjerom da tekst koji se čita iz datoteke odgovara očekivanom tekstu:

@Test javna praznina givenFileReader_whenReadAllCharacters_thenReturnsContent () baca IOException {String očekujeText = "Zdravo, Svijete!"; Datoteka datoteke = nova datoteka (FILE_PATH); probajte (FileReader fileReader = novi FileReader (datoteka)) {Sadržaj niza = FileReaderExample.readAllCharactersOneByOne (fileReader); Assert.assertEquals (očekivaniTekst, sadržaj); }}

3.3. Čitanje niza likova

Čak možemo čitati više znakova odjednom koristeći naslijeđeno čitanje (char cbuf [], int off, int len) metoda:

javni statički niz readMultipleCharacters (čitač čitača, int dužina) baca IOException {char [] buffer = new char [length]; int charactersRead = reader.read (međuspremnik, 0, dužina); if (charactersRead! = -1) {return new String (međuspremnik, 0, charactersRead); } else {povratak ""; }}

Postoji suptilna razlika u povratnoj vrijednosti od čitati() kada je riječ o čitanju više znakova u nizu. The povratna vrijednost ovdje je ili broj pročitanih znakova ili -1 ako je čitač stigao do kraja ulaznog toka.

Dalje, testirajmo ispravnost našeg koda:

@Test javna praznina givenFileReader_whenReadMultipleCharacters_thenReturnsContent () baca IOException {String očekujeText = "Pozdrav"; Datoteka datoteke = nova datoteka (FILE_PATH); probajte (FileReader fileReader = novi FileReader (datoteka)) {Sadržaj niza = FileReaderExample.readMultipleCharacters (fileReader, 5); Assert.assertEquals (očekivaniTekst, sadržaj); }}

4. Ograničenja

Vidjeli smo da Čitač datoteka klasa se oslanja na zadano sistemsko kodiranje znakova.

Dakle, za situacije, gdje trebamo koristiti prilagođene vrijednosti za skup znakova, veličinu međuspremnika ili ulazni tok, moramo koristiti InputStreamReader.

Štoviše, svi znamo da su I / O ciklusi skupi i mogu uvesti latenciju u našu aplikaciju. Dakle, u našem je najboljem interesu minimiziranje broja I / O operacija zamatanjem a BufferedReader oko našeg Čitač datoteka objekt:

BufferedReader u = novi BufferedReader (fileReader);

5. Zaključak

U ovom uputstvu naučili smo o osnovnim konceptima a Čitač i kako Čitač datoteka olakšava izvođenje operacija čitanja tekstualnih datoteka kroz neke primjere.

Kao i uvijek, cjeloviti izvorni kôd vodiča dostupan je na GitHubu.