Lekce 3 - Práce s textovými soubory v Javě

Vydávání, hosting a aktualizace umožňují jeho sponzoři.
V minulém dílu seriálu tutoriálů pro Javu jsme si ukázali, jak fungují přístupová práva v systémech Windows. Nejjednodušší cestou, jak uložit data aplikace na pevný disk, je využít textové soubory. Se soubory s příponou .txt jste se jistě všichni již setkali. Text je v nich uložen jednoduše na jednotlivých řádcích. K oddělení řádků se využívá speciálních znaků, které jsou bohužel specifické pro každý operační systém. Toto však za nás naštěstí vyřeší Java.
Pozn.: V různých materiálech se můžete setkat s použitím různých tříd a různých způsobů k zápisu do souborů. Budu se zde snažit ukazovat způsoby, které jsou nejjednodušší a nejnovější.
Zápis textu do nového souboru
Nejprve si pojďme vytvořit nový textový soubor a něco do něj zapsat. Vytvořte si nový projekt s názvem TextoveSoubory. K zapisování do textových souborů nám Java poskytuje třídu BufferedWriter. Buffered znamená, že zapisovač využívá vyrovnávací paměť, aby urychlil zápis na disk.
Vytvořme blok try-with-resources a založme v něm novou instanci BufferedWriteru. Jak již víme z předchozích dílů, try-with-resources se nám automaticky postará o zavření souboru po dokončení zápisu/čtení. Do konstruktoru vložíme instanci FileWriteru, který BufferedWriter obaluje.
try (BufferedWriter bw = new BufferedWriter(new FileWriter("soubor.txt"))) { } catch (Exception e) { System.err.println("Do souboru se nepovedlo zapsat."); }
Za zmínku stojí použití System.err v bloku catch, což je chybový kanál pro výstup. V případě, že se zápis opravdu nepovede, uvidíte tento text v konzoli červenou barvou.
Náš BufferedWriter je nyní nasměrovaný na správný soubor. Nový řádek zapíšeme pomocí metody write(). Odřádkování v souboru docílíme metodou newLine(). Po dokončení zápisu musíme zavolat metodu flush(), která se stará o vyprázdnění bufferu. S tím se zde nebudeme zatěžovat, postačí nám vědět, že námi zapsané řádky mohou zůstat chvíli ve vyrovnávací paměti a my pomocí flush() vynutíme jejich zápis.
Kód se nám tedy rozrostl a může vypadat např. takto:
try (BufferedWriter bw = new BufferedWriter(new FileWriter("soubor.txt"))) { bw.write("První řádek"); bw.newLine(); bw.write("Tento text je na druhém řádku"); bw.newLine(); bw.write("A do třetice."); bw.newLine(); bw.flush(); } catch (Exception e) { System.err.println("Do souboru se nepovedlo zapsat."); }
Po spuštění se vytvoří soubor.txt ve složce s naším projektem. Jak se správně v Javě vypořádat s cestou k souboru a právy jsme si již ukazovali a zde to pro jednoduchost zanedbáme. Vidíme, že soubor existuje a opravdu obsahuje náš text:

Připsání textu do existujícího souboru
Pokud soubor neexistuje, kód výše ho vytvoří. Pokud existuje, bude přepsán. Toto chování můžeme změnit pomocí 2. parametru konstruktoru objektu FileWriter. Pokud ho nastavíme na true, provede se tzv. append (připsání). Takto do existujícího souboru připíšeme nový řádek:
try (BufferedWriter bw = new BufferedWriter(new FileWriter("soubor.txt", true))) { bw.write("Připsaný řádek"); bw.newLine(); bw.flush(); } catch (Exception e) { System.err.println("Do souboru se nepovedlo zapsat."); }
Pokud soubor neexistuje, bude vytvořen. Pokud existuje, bude do něj připsáno a jeho původní obsah zůstane.
Čtení existujícího souboru
Zbývá nám již jen umět soubor načíst. Není to o nic složitější, než zápis a opět k tomu máme v Javě připravenou třídu, konkrétně BufferedReader. Použití je obdobné, namísto metody write() použijeme readLine(), která vrací řádek textu ze souboru a zároveň se přesune na řádek následující. Budeme ji tedy volat ve while cyklu. Podmínka pro ošetření vyjetí ze souboru je možná krkolomnější, kontrolujeme, zda proběhlo přiřazení nové řádky do proměnné.
Kód k výpisu obsahu souboru do konzole by vypadal takto:
try (BufferedReader br = new BufferedReader(new FileReader("soubor.txt"))) { String s; while ((s = br.readLine()) != null) { System.out.println(s); } } catch (Exception e) { System.err.println("Chyba při čtení ze souboru."); }
Kód celého našeho programu vypadá nyní asi takto:
// zápis do souboru try (BufferedWriter bw = new BufferedWriter(new FileWriter("soubor.txt"))) { bw.write("První řádek"); bw.newLine(); bw.write("Tento text je na druhém řádku"); bw.newLine(); bw.write("A do třetice."); bw.newLine(); bw.flush(); System.out.println("Do souboru bylo zapsáno"); } catch (Exception e) { System.err.println("Do souboru se nepovedlo zapsat."); } // připsání textu do existujícího souboru try (BufferedWriter bw = new BufferedWriter(new FileWriter("soubor.txt", true))) { bw.write("Připsaný řádek"); bw.newLine(); bw.flush(); System.out.println("Do souboru bylo připsáno"); } catch (Exception e) { System.err.println("Do souboru se nepovedlo zapsat."); } // výpis obsahu souboru System.out.println("Vypisuji celý soubor:"); try (BufferedReader br = new BufferedReader(new FileReader("soubor.txt"))) { String s; while ((s = br.readLine()) != null) { System.out.println(s); } } catch (Exception e) { System.err.println("Chyba při čtení ze souboru."); }
A výsledek:

Opominuli jsme kontrolu práv. Do souborů také budeme chtít většinou ukládat spíše objekty, než řádky textu. To si ukážeme dále, v lekci Uložení objektů do CSV v Javě.
Stáhnout
Staženo 768x (17.16 kB)
Aplikace je včetně zdrojových kódů v jazyce java
Komentáře


Zobrazeno 10 zpráv z 20. Zobrazit vše