IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

14. diel - Práca so súbormi a zložkami v Jave

V minulej lekcii, Výnimky v Jave tretíkrát a techniky s nimi spojené , sme dokončili výnimky. Dnes si popíšeme triedy v Jave, ktoré nie sú nijako závislé od typu súboru a ich použitie je teda všeobecné. Umožňujú pracovať so súbormi a zložkami na úrovni operačného systému, čo iste budeme v našich aplikáciách potrebovať. V tejto lekcii si predstavíme triedu File, jej metódy a použitia.

Absolútna vs. relatívna cesta

Než sa pustíme do opisu triedy File, v krátkosti si niečo povieme k absolútnej a relatívnej ceste. Je to čisto pre poriadok, aby sme mali jasno.

Absolútna cesta

Je taká cesta, ktorá začína koreňovým prvkom súborového systému. V prípade Windows to bude niečo ako: C:\\ alebo D:\\, pre Linux to bude veľmi jednoducho /. Absolútna cesta nepotrebuje žiadne ďalšie informácie na určenie umiestnenia súboru. Všetko je na jednom mieste. Problém ale je, že cesta je platforme závislá. Ako už bolo naznačené, pre Windows a Linux sa líšia. Preto odporúčam absolútnej cesty v ideálnom prípade nepoužívať. Prípadne iba pre súbory s nastavením programu.

Relatívna cesta

Relatívna cesta nezačína v koreni súborového systému. Na miesto toho sa počíta v závislosti k nejakému existujúcemu prvku (najčastejšie k aktuálnemu programu), napr. obrazky/. Toto je rozhodne cesta kadiaľ ísť v prípade práce so súbormi v programe.

Trieda File

Trieda File je v Jave už od prvej verzie. Postupom času sa ukázalo, že má nejaké "muchy", ktoré vyústili vo vytvorenie nového API (ale o tom až v budúcej lekcii).

Trieda reprezentuje ako súbor, tak i zložku. Pre prácu so súborom / zložkou je potreba vytvoriť novú inštanciu. To možno vykonať veľmi jednoducho:

File file = new File("soubor.txt");

Konštruktor má celkom 4 preťaženie:

public File(String pathname);
public File(String parent, String child);
public File(File parent, String child)
public File(URI uri)

V prvom prípade možno dosadiť ako absolútna, tak relatívnu cestu. Ak použijete relatívnu cestu, výsledok sa bude vždy počítať z použitého súboru.

Použitý súbor sa myslí výsledný JAR súbor, nie * .class.

Druhé preťaženie prijíma dva reťazce. Prvý reťazec predstavuje cestu k rodičmi a môže byť ako relatívna, tak absolútna. Druhý parameter je cesta relatívna k rodičovi v prvom parametri.

Rodič je akákoľvek nadradená zložka, napríklad "C: //". Potomok je súbor / zložka, ktorá sa nachádza v nadradenej zložke, napríklad: "C: //soubor.txt"

Tretia preťaženia je rovnako ako prvý, len sa líšia v prvom parametri, ktorým je teraz iná inštancia triedy File.

Posledné preťaženie prijíma tzv. URI. Je to skratka pre Uniform Resource Identifier. (Nepliesť s URL). Kompletné syntax pre URI je vidieť nižšie:

URI je štandard pre identifikáciu dokumentov, využívajúci schéma popísané nižšie. URL je "podmnožina" URI a obsahuje informácie, ako spracovať zdroje z nejakého umiestnenia.

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

Toto je všeobecné schéma. Nám postačí iba základné, kde za časť "scheme" dosadíme 'file' a potom až cestu.

file:/tmp/soubor.txt

S týmto prístupom sa najčastejšie stretneme pri použití rôznych obrázkov, zvukov a ďalších súborov, ktoré zabalíme do jari. K týmto súborom zvyčajne pristupujeme pomocou metódy getClass().getResource(String name). Táto metóda vracia práve URI, ktoré odovzdáme konstruktoru triedy File.

Najčastejšie ale budeme pracovať s prvým preťažením konstruktoru.

Metódy triedy File

Metódy si roztriedime do niekoľkých kategórií:

  • get
  • set
  • can
  • is
  • funkčné

Get metódy

Máme k dispozícii nasledujúce get metódy, ktoré si všetky hneď prakticky vyskúšame:

  • getAbsolutePath(): String - vráti absolútnu cestu k súboru
  • getCanonicalPath(): String - vráti canonizovanou cestu k súboru
  • getFreeSpace(): long - vráti počet voľných bytov v oddielu, v ktorom sa súbor nachádza
  • getName(): String - vráti názov súboru
  • getParent(): String - vráti absolútnu cestu k rodičovi, alebo null, ak súbor je sám rodič
  • getParentFile(): File - vráti inštanciu triedy File reprezentujúci rodičia aktuálneho súboru
  • getPath(): String - vráti cestu k súboru (vopred nie je isté, v akom tvare ju dostanete, preto je lepšie používať getCanonicalPath()
  • getTotalSpace(): long - vráti celkový počet bytov v oddielu, v ktorom sa súbor nachádza
  • getUsableSpace(): long - vráti počet použiteľných bytov pre aktuálny virtuálny stroj; výsledok je presnejší, než z metódy getFreeSpace()

Pre istotu si napíšeme aj príklady použitia. Vytvoríme jednu inštanciu triedy File a zavoláme nad ňou všetky GET metódy.

Pre demonštráciu som schválne vytvoril nešikovnou zložkovú štruktúru, aby boli vidieť rozdiely medzi jednotlivými metódami. Zložky sú vytvorené nasledovne:

src
|---cz
|   |---itnetwork
|       |---souboryslozky
|           |---App.java
|---soubory
|   |---soubor.txt

Inštanciu triedy File vytvoríme takto:

File file = new File("../../../soubory/soubor.txt");

Schválne sme použili niekoľkokrát sekvenciu ../, ktorá nás vráti o zložku späť vzhľadom k aktuálnej zložke, aby bol výsledok zaujímavejšie.

Výstup jednotlivých metód:

Konzolová aplikácia
getAbsolutePath(): /tmp/itn/soubory-slozky/../../../soubory/soubor.txt
getCanonicalPath(): /soubory/soubor.txt
getFreeSpace(): 0
getName(): soubor.txt
getParent(): ../../../soubory
getParentFile(): ../../../soubory
getPath(): ../../../soubory/soubor.txt
getTotalSpace(): 0
getUsableSpace(): 0

SET metódy

Set metódy, ako názov už napovedá, súborom nastavujú nejaké vlastnosti. Sú to:

  • setExecutable(boolean executable, boolean ownerOnly): boolean - nastaví, či je súbor spustiteľný; druhý parameter je nepovinný (existuje preťaženie, kedy sa tento parameter automaticky nastaví na true); ak je druhý parameter true, tak sa aktivitu behu nastaví len aktuálnemu užívateľovi
  • setLastModified(long time): boolean - nastaví dátum poslednej úpravy
  • setReadable(boolean readable, boolean ownerOnly): boolean - nastaví, či je súbor možné čítať; pre druhý parameter platí to isté ako u prvej metódy
  • setReadOnly(): boolean - jednosmerná metóda, pomocou ktorej sa nastaví súbor iba pre čítanie -> nepôjde do neho zapisovať
  • setWritable(boolean writable, boolean ownerOnly): boolean - nastaví, či je možné do súboru zapisovať; pre druhý parameter platí to isté ako u prvej metódy

CAN metódy

Can metódy máme nasledujúce:

  • canExecute(): boolean - vráti true, ak možno súbor spustiť, inak false
  • canRead(): boolean - vráti true, ak možno zo súboru čítať, inak false
  • canWrite(): boolean vráti true, ak sa dá do súboru zapisovať, inak false

IS metódy

Pomocou "IS" metód sa môžeme pýtať na tieto veci:

  • isAbsolute(): boolean - vráti true, ak bola inštancia vytvorená za pomoci absolútnej cesty
  • isDirectory(): boolean - vráti true, ak ide o zložku
  • isFile(): boolean - vráti true, ak ide o súbor
  • isHidden(): boolean - vráti true, ak je súbor skrytý

Funkčne metódy

Z preberaných metód nám už len chýba tvz. "Funkčné" metódy, teda také metódy, ktoré niečo vykonáva so samotným súborom a ktoré budeme využívať najčastejšie.

  • toURI(): URI - vytvorí URI z použitej inštancie súboru
  • createNewFile(): boolean - vytvorí nový súbor ak neexistuje; vráti true, ak sa súbor podarilo vytvoriť, inak false
  • delete(): boolean - zmaže súbor; vráti true, ak sa súbor podarilo zmazať, inak false
  • deleteOnExit(): void - zmaže súbor až po ukončení programu
  • exists(): boolean - vráti true, ak súbor existuje, inak false
  • length(): long - vráti veľkosť súboru v bytoch
  • list(): String[] - vráti pole absolútnych ciest súborov v priečinku
  • listFiles(): File[] - vráti pole inštancií súboru v zložke
  • mkdir(): boolean - pokúsi sa vytvoriť priečinok; vráti true, ak sa zložka vytvorila, inak false
  • mkdirs(): boolean - pokúsi sa vytvoriť všetky zložky v ceste; vráti true, ak sa všetky zložky vytvorili, inak false
  • renameTo(File dest): boolean - premenuje súbor na nové meno; možno chápať ako "presun" súboru z jedného miesta na druhé; metóda je platforme závislá; nemožno použiť pre presun súboru medzi dvoma súborovými systémami
  • toPath(): Path - vytvorí novú inštanciu rozhrania Path, o ktorom si povieme v budúcej lekcii

Problémy File API

File API trpia nasledujúcimi nedostatkami:

  • veľká väčšina metód vracia iba true, alebo false v prípade, že sa niečo nepodarí; problém je, že nepoznáme príčinu neúspechu
  • premenovanie súboru nefunguje na všetkých platformách rovnako
  • API nepodporuje symbolické linky
  • v API chýba podpora metadát (povolenie, vlastník súboru ...)

V budúcej lekcii, Práca so súbormi a zložkami v Jave - Nové API , sa zoznámime s novými triedami pre prácu so súbormi a zložkami, ktoré tieto problémy rieši.


 

Predchádzajúci článok
Výnimky v Jave tretíkrát a techniky s nimi spojené
Všetky články v sekcii
Práca so súbormi v Jave
Preskočiť článok
(neodporúčame)
Práca so súbormi a zložkami v Jave - Nové API
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity