2. diel - Úvod do práce so súbormi v Jave
V predchádzajúcom diele nášho tutoriálu Java, Výnimky v Jave, sme si vysvetlili výnimky, ktoré na prácu so súbormi nutne potrebujeme, pretože vďaka nim môžeme reagovať na prípadné chyby.
V dnešnom tutoriáli Java si povieme niečo o súboroch a o právach na zápis na moderných operačných systémoch. Tiež si ukážeme tvorbu zástupného objektu pre súbor, s ktorým chceme pracovať.
Dáta, resp. objekty uložené v pamäti, sa samozrejme s vypnutím aplikácie stratia. Ak chceme zaistiť, aby boli dáta tzv. perzistentné (trvalé), musíme ich pri ukončení programu uložiť a pri načítaní programu opäť načítať. Na ukladanie dát existuje mnoho spôsobov, každý má svoje výhody a nevýhody.
Dáta našej aplikácie môžeme ukladať nasledujúcimi spôsobmi:
- Textové súbory s jednoduchou štruktúrou (napr.
.txta.csv). - Textové súbory s vnútornou hierarchiou (napr.
.xmlalebo.json). - Súbory binárneho typu (odtlačok pamäte do súboru).
- Databáza.
Historicky sú v Jave na prácu so súbormi k dispozícii dve rôzne API:
- staršie
java.io.*, ktorého stredobodom je triedaFile - novšie
java.nio.*, ktorý sa točí okolo triedPathaFiles
Obe tieto API spolu koexistujú. Hoci sa odporúča v novom kóde používať nové API, v praxi sa často stretneme s potrebou použiť aj to staršie, takže je dobré poznať obe. V našom kurze sa budeme zameriavať na nové API, ale miestami si ukážeme, ako by sa daná vec robila pomocou staršieho API.
Práva na zápis na disk v moderných operačných systémoch
Všetky moderné operačné systémy majú nejaký systém prístupových práv k súborom uloženým na disku. Bežný užívateľ má zvyčajne právo vytvoriť súbory a zapisovať do súborov iba vo svojom domovskom adresári. Administrátor môže zapisovať kamkoľvek. Ak v našej aplikácii zakladáme súbory, musíme ich založiť tam, kde má užívateľ právo zapisovať.
V reálnej aplikácii sa používateľa najskôr spýtame,
kde chce nový súbor vytvoriť. Potom skontrolujeme, či môže do danej
lokácie zapisovať. V našich lekciách kvôli jednoduchosti tento krok
preskočíme. Všetky súbory budeme zakladať v podadresári
ictdemy/ v domovskom adresári užívateľa.
Domovský adresár používateľa
Domovský adresár užívateľa sa nachádza v každom systéme na inom mieste. Keďže sa snažíme tvoriť multiplatformové aplikácie, vyhneme sa špecifickým cestám k súborom v jednotlivých operačných systémoch. Java nám na to dáva prostriedky.
Domovský adresár používateľa zistíme týmto kódom:
System.getProperty("user.home");
Systémy Windows
V systémoch Windows vyššie uvedený kód vráti:
C:\Users\your_name\
Všimnime si oddeľovače adresárov \, ktorým je
spätná lomka. Windows je tiež špecifický v označovaní
diskov písmenami (C, D, ...).
Systémy Linux
V systémoch Linux vyššie uvedený kód vráti:
/home/your_name/
Operačné systémy, ktoré sa hlásia k unixovej tradícii,
používajú pre oddeľovač adresárov lomku
/.
Systém MacOS
V systéme MacOS vyššie uvedený kód vráti:
/Users/your_name
Systém MacOS používa pre oddeľovač adresárov aj
lomku /.
Vytvorenie Path z
nového API java.nio.*
Základom úspešnej práce so súbormi v Jave je mať správne vytvorenú
inštanciu triedy Path (pri použití novšieho
API), alebo File (pri použití staršieho API). Táto inštancia
triedy predstavuje cestu k súboru, s ktorým chceme pracovať.
Čítanie súboru, alebo zápis do súboru potom prebieha pomocou tejto
inštancie.
Poďme sa teda najprv pozrieť na to, ako správne vytvoriť inštanciu
triedy Path. Na vytvorenie inštancie triedy Path
slúži statická metóda of() volaná na triede
Path:
Path path = Path.of(file_path);
Príklad
Napríklad cestu k súboru file.txt, v podadresári
ictdemy, v našom domovskom adresári definujeme takto:
Path path = Path.of(System.getProperty("user.home"), "ictdemy", "file.txt");
V kóde neriešime špecifické cesty k súboru pre jednotlivé
operačné systémy. System.getProperty() dosadí správnu cestu
pre platformu, na ktorej je aplikácia spustená.
Inštancia triedy Path je ukazovateľ miesta na
disku, kde môže, ale nemusí daný súbor byť. Taktiež nemusia
existovať všetky adresáre v ceste k súboru. Napríklad v našom príklade je
možné, že ešte nemáme v našom domovskom adresári adresár
ictdemy/.
Kontrola adresárov
Poďme sa teda najprv uistiť, že všetky potrebné adresáre naozaj
existujú a prípadne ich vytvoriť. Na to slúži statická
metóda createDirectories() z triedy
Files:
Path path = Path.of(System.getProperty("user.home"), "ictdemy", "file.txt"); Files.createDirectories(path.getParent());
Metóda getParent() vracia adresár, v ktorom sa nachádza
file.txt. V našom príklade je to adresár ictdemy/.
Metóda createDirectories() vytvorí celú potrebnú hierarchiu
adresárov vrátane ictdemy/.
Pokiaľ by niektorý adresár už existoval, metóda
createDirectories() vytvorenie adresára preskočí bez vyvolania
výnimky. Preto je vhodné ju použiť pri každom definovaní cesty k
súboru.
Vytvorenie File
zo staršieho API java.io.*
Pri použití staršieho API pracujeme s triedou File.
Vytvorenie samotnej inštancie je tu veľmi podobné:
File path = new File("file_path");
Na rozdiel od triedy Path, trieda File
očakáva cestu k súboru ako jeden String.
Príklad
Rovnako ako v prípade Path, aj tu môžeme využiť
System.getProperty() na získanie cesty k domovskému
adresáru. Našu cestu k súboru file.txt, v podadresári
ictdemy/, v našom domovskom adresári definujeme takto:
File path = new File(System.getProperty("user.home") + File.separator + "ictdemy" + File.separator + "file.txt");
Pomocou File.separator vytvoríme platnú cestu pre
akúkoľvek platformu.
Kontrola adresárov
Rovnako ako v prípade Path aj teraz potrebujeme skontrolovať,
či existujú všetky definované adresáre. Na to využijeme
metódu mkdirs(), ktorú tentoraz zavoláme na inštanciu triedy
File:
File path = new File(System.getProperty("user.home") + File.separator + "ictdemy" + File.separator + "file.txt"); path.getParentFile().mkdirs();
Pred samotným zavolaním mkdirs() zavoláme
metódu getParentFile(). Metóda getParentFile()
vráti adresár, v ktorom sa bude nachádzať file.txt.
Prevediteľnosť Path <->
File
Triedy Path a File medzi sebou ponúkajú
jednoduchú konverziu.
Konverzia Path na
File
Na prevedenie cesty k súboru z inštancie triedy Path na
inštanciu triedy File, zavoláme metódu toFile() na
inštanciu triedy Path:
Path path = Path.of(...); File file = path.toFile();
Konverzia File na
Path
Na prevedenie cesty k súboru z inštancie triedy File na
inštanciu triedy Path, zavoláme metódu toPath() na
inštanciu triedy File:
File file = new File(...);
Path path = file.toPath();
Teraz už teda vieme, ako správne vytvoriť inštancie tried
Path a File, ktoré môžeme použiť v akomkoľvek
operačnom systéme.
Nič nám už nebráni, aby sme si nabudúce, Práca s textovými súbormi v Jave, ukázali prácu s prvým formátom súborov, ktorým budú textové súbory.

David sa informačné technológie naučil na