Sprievodca triedou Java FileReader

1. Prehľad

Ako už názov napovedá, FileReader je a Trieda Java, ktorá uľahčuje čítanie obsahu súboru.

V tomto tutoriále sa dozvieme základný koncept a Čitateľ a ako môžeme použiť FileReader trieda na vykonávanie operácií čítania na toku znakov v Jave.

2. Čitateľ Základy

Ak sa pozrieme na kód FileReader triedy, potom si všimneme, že trieda obsahuje minimálny kód na vytvorenie a FileReader objekt a ziadne ine metody.

To vyvoláva otázky ako „Kto robí ťažké zdvíhanie za touto triedou?“

Aby sme mohli odpovedať na túto otázku, musíme pochopiť koncept a hierarchiu Čitateľ triedy v Jave.

Čitateľ je abstraktná základná trieda, ktorá umožňuje čítanie znakov prostredníctvom jednej z jej konkrétnych implementácií. Definuje nasledujúce základné operácie čítania znakov z ľubovoľného média, napríklad z pamäte alebo zo súborového systému:

  • Prečítajte si jeden znak
  • Prečítajte si pole znakov
  • Označte a vynulujte danú pozíciu v prúde znakov
  • Počas čítania toku znakov preskočte pozíciu
  • Zatvorte vstupný prúd

Prirodzene, všetky implementácie Čitateľ trieda musí implementovať všetky abstraktné metódy, a to čítať() a Zavrieť(). Väčšina implementácií navyše prepíše iné zdedené metódy, aby poskytla ďalšiu funkčnosť alebo lepší výkon.

2.1. Kedy použiť a FileReader

Teraz, keď už máme nejaké pochopenie o Čitateľ, sme pripravení obrátiť naše zameranie späť na FileReader trieda.

FileReader zdedí svoju funkcionalitu z InputStreamReader, čo je a Čitateľ implementácia určená na čítanie bajtov zo vstupného toku ako znakov.

Pozrime sa na túto hierarchiu v definíciách tried:

verejná trieda InputStreamReader rozširuje Reader {} verejná trieda FileReader rozširuje InputStreamReader {}

Všeobecne môžeme použiť InputStreamReader na čítanie znakov z ľubovoľného vstupného zdroja.

Pokiaľ však ide o čítanie textu zo súboru, použite znak InputStreamReader by bolo ako krájať jablko mečom. Správnym nástrojom by samozrejme bol nôž, čo je presne to, čo FileReader sľuby.

Môžeme použite a FileReader keď chceme čítať text zo súboru pomocou predvolenej znakovej sady systému. Pre akékoľvek ďalšie pokročilé funkcie by bolo ideálne použiť InputStreamReader triedy priamo.

3. Čítanie textového súboru pomocou a FileReader

Poďme sa prejsť kódovacím cvičením čítania postáv z a HelloWorld.txt súbor pomocou a FileReader inštancia.

3.1. Vytvorenie a FileReader

Ako trieda pohodlia FileReader ponúka troch preťažených konštruktérov ktoré možno použiť na inicializáciu čítačky, ktorá dokáže čítať zo súboru ako vstupný zdroj.

Pozrime sa na týchto konštruktérov:

public FileReader (String fileName) hodí FileNotFoundException {super (nový FileInputStream (fileName)); } public FileReader (súborový súbor) hodí FileNotFoundException {super (nový FileInputStream (súbor)); } public FileReader (FileDescriptor fd) {super (nový FileInputStream (fd)); }

V našom prípade poznáme názov vstupného súboru. V dôsledku toho môžeme použiť prvý konštruktor na inicializáciu čítačky:

FileReader fileReader = nový FileReader (cesta);

3.2. Čítanie jedného znaku

Ďalej poďme vytvárať readAllCharactersOneByOne (), metóda na čítanie znakov zo súboru po jednom:

public static String readAllCharactersOneByOne (Reader reader) vyvolá IOException {StringBuilder content = new StringBuilder (); int nextChar; while ((nextChar = reader.read ())! = -1) {content.append ((char) nextChar); } návrat String.valueOf (obsah); }

Ako vidíme z vyššie uvedeného kódu, máme použilčítať() metóda v slučke na čítanie znakov jeden po druhom, až kým sa nevráti hodnota -1, čo znamená, že už nie je potrebné čítať žiadne znaky.

Teraz otestujme náš kód overením, či sa text načítaný zo súboru zhoduje s očakávaným textom:

@Test public void givenFileReader_whenReadAllCharacters_thenReturnsContent () vyvolá IOException {String expectText = "Hello, World!"; File file = nový súbor (FILE_PATH); try (FileReader fileReader = new FileReader (file)) {String content = FileReaderExample.readAllCharactersOneByOne (fileReader); Assert.assertEquals (expectText, content); }}

3.3. Čítanie poľa postáv

Pomocou zdedeného dokážeme dokonca prečítať viac znakov naraz čítať (char cbuf [], int vypnuté, int len) metóda:

public static String readMultipleCharacters (Reader reader, int length) throws IOException {char [] buffer = new char [length]; int znakyRead = reader.read (buffer, 0, dlžka); if (charactersRead! = -1) {return new String (buffer, 0, charactersRead); } else {return ""; }}

V návratnej hodnote je malý rozdiel čítať() pokiaľ ide o čítanie viacerých znakov v poli. The návratová hodnota je tu buď počet prečítaných znakov, alebo -1 ak čítačka dosiahla koniec vstupného toku.

Ďalej otestujeme správnosť nášho kódu:

@ Test public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent () vyvolá IOException {String expectText = "Hello"; File file = nový súbor (FILE_PATH); try (FileReader fileReader = new FileReader (file)) {String content = FileReaderExample.readMultipleCharacters (fileReader, 5); Assert.assertEquals (expectText, content); }}

4. Obmedzenia

Videli sme, že FileReader trieda sa spolieha na predvolené systémové kódovanie znakov.

Takže pre situácie, kde potrebujeme použiť vlastné hodnoty pre znakovú sadu, veľkosť vyrovnávacej pamäte alebo vstupný tok musíme použitie InputStreamReader.

Všetci navyše vieme, že I / O cykly sú drahé a môžu vnášať latenciu do našej aplikácie. Je to teda v našom najlepšom záujme minimalizujte počet I / O operácií zabalením a BufferedReader okolo nášho FileReader objekt:

BufferedReader in = nový BufferedReader (fileReader);

5. Záver

V tomto návode sme sa dozvedeli o základných pojmoch a Čitateľ a ako FileReader vďaka niektorým príkladom uľahčuje operácie čítania v textových súboroch.

Kompletný zdrojový kód tutoriálu je ako vždy k dispozícii na GitHub.