Práca so súbormi a adresármi operačného systému

<< Výnimky (odchytávanie) | Obsah | Textové súbory >>

Každý z vás už určite prišiel do styku s adresármi a súbormi. V jave používame triedu File ktorej objekty identifikujú buď jeden súbor alebo jeden adresár. Ako súbor tak aj adresár na lokálnom počítači sú jednoznačne určené svojou cestou. Cesta môže byť úplná, alebo relatívna.

Úplná cesta vo windowse je napríklad "C:\Windows\System32\shell32.dll" alebo "C:\Windows", v linuxe napríklad "/home/peter/heslo.txt" alebo "/etc".

Relatívna cesta je vždy vzhľadom k nejakému adresáru napríklad "System32\shell32.dll" je relatívna cesta vzhľadom k "C:\Windows".

Položky v ceste sú vo windowse oddelené spätnou lomkou "\" alebo obyčajnou lomkou "/" (niektorí o tom nevedia), v linuxe vždy obyčajnou lomkou. Ak budete chcieť používať spätné lomky dajte si pozor na to, že v reťazcoch spätná lomka označuje špeciálny znak, takže musí byť zdvojená, aby sa brala ako znak '\'.

// úplná cesta k adresáru s použitím spätných lomiek
File adresar = new File("C:\\Windows\\System32");
// úplná cesta k súboru s použitím obyčajných lomiek
File subor1 = new File("C:/Windows/system.ini");
// relatívna cesta k súboru vzhľadom k adresáru C:\Windows\System32
File subor2 = new File(adresar, "shell32.dll");
// relatívna cesta k súboru vzhľadom k aktuálnemu adresáru
File subor3 = new File("heslo.txt");

Ak spúšťate program z Eclipsu tak aktuálny adresár je adresár projektu, inak je to adresár z ktorého bol program spustený. Ak niekedy náhodou budete potrebovať zistiť meno aktuálneho adresára použite nasledovný kód:

String menoAktAdresara = System.getProperty("user.dir");
System.out.println("Nazov aktualneho adresara je: " + menoAktAdresara);

Cez metódy triedy File sa nevieme dostať k obsahu súboru iba k jeho metadátam, teda informáciám o tomto súbore. Metadáta o súboroch bežne vidíme v súborovom manažéri (napr. Explorer, Windows commander, Total commander, Krusader, mc a iných)). Metadáta obsahujú napríklad veľkosti súborov, obsahy adresárov či práva na čítanie/zápis/spúšťanie.

Veľmi dôležitou vecou, ktorú si je potrebné uvedomiť je, že daný súbor alebo adresár nemusí reálne existovať. Java pri kompilácii zdrojového kódu netestuje, či cesta špecifikovaná pri vytvárani objektu triedy File má aj spoj proťajšok v súborovom systéme. Predstavte si to ako adresu domu. Môžeme napísať na pohľadnicu adresu Ján Javák, Kompilačná 8, Košice, ale to ešte neznamená, že také mesto, ulica alebo Jano Javák bývajúci na tejto adrese existujú.

Prehľad niektorých užitočných metód znázorňuje nasledujúca tabuľka (neučte sa ju naspamäť).

metódačinnosť
String getPath()vráti úplný názov súboru alebo adresára
String getName()vráti názov súboru alebo adresára (bez cesty)
boolean exists()vráti true, ak súbor/adresár existuje
boolean isFile()zistí, či inštancia zodpovedá súboru
boolean isDirectory()zistí, či inštancia zodpovedá adresáru
long length()vráti veľkosť súboru
createNewFile()vytvorí súbor, ak neexistuje. Môže vyvolať výnimku IOException ak nemáme dostatočné práva alebo neexistuje adresár v ktorom by sa mal tento súbor vytvoriť.
mkdir()vytvorí adresár, zodpovedajúci poslednej položke v ceste, nadadresár musí existovať
mkdirs()vytvorí celú adresárovú štruktúru v ceste
renameTo(File)premenuje súbor podľa inej inštancie triedy File
delete()odstráni súbor
String[] list()vráti pole názvov súborov/podadresárov v adresári. Vráti null ak nejde o existujúci adresár
File[] listFiles()vráti pole inštancií triedy File zodpovedajúcich súborom/podadresárom v adresári. Vráti null ak nejde o existujúci adresár

Predstavte si, že chceme vypísať všetky súbory a podadresáre. Použijeme metódu list():

File adresár = new File("D:/MP3/Jackson");
String[] suboryAPodadresare = adresár.list();
if (suboryAPodadresare != null) {
  for(int i = 0; i < suboryAPodadresare.length; i++) {
    System.out.println(suboryAPodadresare[i]);  
  }
}

Ak by sme však okrem mien chceli vedieť aj veľkosti všetkých mp3 súborov, už si s metódou list() navystačíme, lebo okrem názvu potrebujeme ku každej položke zistiť, či to je súbor, a akú má veľkosť. Použijeme teda listFiles().

File adresár = new File("D:/MP3/Jackson");
File[] súboryAPodadresáre = adresár.listFiles();
if (súboryAPodadresáre != null) {
  for(int i = 0; i < súboryAPodadresáre.length; i++) {
    File súborČiPodadresár = súboryAPodadresáre[i];  
    if(súborČiPodadresár.isFile()) {
      String menoSúboru = súborČiPodadresár.getName();
      long veľkosť = súborČiPodadresár.length();
      if(menoSúboru.endsWith("mp3")) {
        System.out.println(menoSúboru + " " + veľkosť);
      }
    }
  }
}