Deo zbornika Učimo Javu

Java Klasa Fajl

Klasa java.io.File predstavlja ime fajla na računaru. Njome se pokušavaju apstrahovati dijelovi imena koji su zavisni o računaru, na primjer putanja, separator i slično.

Relativne i apsolutne putanje

Dva su načina referenciranja datoteka, relativni i apsolutni. Apsolutno imenovanje daje potpuni put do datoteke, počevši od imena diska pa dalje. Detalji ovise o operacijskom sustavu. Na primjer:

Unix:   "/math/vedris/file1"
DOS:    "C:\math\vedrisfile1"
MacOS:  "Macintosh HD:math:vedris:file1"

Sva ova tri stringa referenciraju datoteku file1 na glavnom disku u direktoriju /math/vedris/. Razlikuju se na primjer po separatoru. Unix koristi /, Dos i Windows \, MacOS :. Drugi sustavi mogu koristiti nešto posve drugo. Također, nema garancije da se glavni disk na Macu zove baš “Macintosh HD” ili da uopće postoji disk s tim imenom. Na Unixu / i /math mogu biti na različitim diskovima, pa čak i na različitim mašinama. Zbog takvih razloga apsolutna imena treba uglavnom izbjegavati.

Relativno imenovanje, koje treba koristiti kad god je moguće, ne daje potpuni put do datoteke, već put koji je relativan prema nekoj poznatoj datoteci. Relativni put može pokazati datoteku u istom direktoriju jednostavno navođenjem njenog imena. Ili može pokazivati na datoteku u poddirektoriju. Općenito se jedan direktorij uzima za “radni” i metode koje traže datoteke činit će to u odnosu na taj direktorij. Uobičajeno je da to bude direktorij iz kojeg započinjete izvršavati aplikaciju.

Objekt tipa java.io.File može biti ime direktorija isto kao i ime datoteke. Postoje metode kojima možete utvrditi da li dani File objekt zaista referencira stvarnu datoteku (metoda exists()).

Konstruktori klase File

Tri su konstruktora za klasu File. Svaki uzima neku varijaciju imena datoteke kao argument. Najjednostavniji je:

public File(String path)

Ovdje je path naprosto String koji sadrži potpuni ili relativni put do datoteke. Na primjer:

File f1 = new File("ulaz.txt");
File f2 = new File("/etc/passwd");

Ako želite, možete put do datoteke odvojiti od njenog imena koristeći sljedeći konstruktor:

public File(String path, String name)

Ovdje je name ime datoteke, a path ime direktorija u kojem se ona nalazi. Na primjer:

File f2 = new File("/etc", "passwd");

Na kraju, imamo i konstruktor

public File(File dir, String name)

koji se ponaša kao i prethodni, ali je dir ovdje objekt tipa File, a ne naprosto String.

Neke metode u drugim klasama također vraćaju objekt tipa File, na primjer metode iz klase java.awt.FileDialog. Takvi će objekti poštovati sve konvencije operacijskog sustava na kojem se aplikacija izvršava.

Metode klase File

Kad jednom imate objekt tipa File, postoji mnogo stvari koje o njemu možete pitati i koje s njim možete učiniti.

public String getName()

Elementarno pitanje o datoteci je ono o njenom imenu. Ime ćete doznati pomoću metode getName() koja ne uzima nikakve argumente, a vraća strunu koja sadrži ime datoteke (bez puta). Na primjer, dobit ćete file1 umjesto /math/vedris/file1.

public String getPath()

Metoda getPath() vraća strunu koja sadrži put do datoteke. Bit će relativan ili apsolutan, ovisno o načinu na koji je objekt kreiran.

public String getAbsolutePath()

Metoda getAbsolutePath() vraća puni, apsolutni put do datoteke.

public String getCanonicalPath() throws IOException

Metoda getCanonicalPath() vraća kanonsku formu puta do datoteke. Ta je forma zavisna o operacijskom sustavu i mašini.

public String getParent()

Metoda getParent() vraća ime jedinstvenog nadređenog direktorija u odnosu na onaj u kojem se datoteka nalazi, ili null ako je već dosegnut vrh hijerarhije.

public boolean exists() throws SecurityException

Metoda exists() odgovara da li određena datoteka postoji na mjestu gdje je očekujete.

public boolean canWrite() throws SecurityException

Metoda canWrite() daje odgovor da li imate pravo pisanja u datoteku. To nije loše provjeriti prije nego stvarno pokušati nešto upisati.

public boolean canRead() throws SecurityException

Metoda canRead() daje odgovor da li imate pravo čitanja iz datoteke. Dobro ju je koristiti prije stvarnog pokušaja čitanja.

public boolean isFile() throws SecurityException

Metoda isFile() odgovara na pitanje da li se radi o datoteci (za razliku od direktorija).

public boolean isDirectory() throws SecurityException

Metoda isDirectory() vraća true ako se radi o direktoriju.

public boolean isAbsolute()

Metoda isAbsolute() vraća true ako je dano ime apslolutni put, a false ako nije.

public long lastModified() throws SecurityException

Metoda lastModified() vraća vrijeme zadnje promjene. Kako je konverzija u pravi datum dugačka, a procedura ovisna o platformi, to treba koristiti uglavnom za usporedbu vremena zadnje promjene dvaju različitih datoteka.

public long length() throws SecurityException

Metoda length() daje veličinu datoteke u bajtovima.

public boolean mkdir()

Metoda mkdir() pokušava kreirati direktorij sa zadanim imenom. Ako uspije, vratit će true, inače false.

public boolean mkdirs() throws SecurityException

Metoda mkdirs() za dano ime kreira ne samo jedan, nego sve potrebne nadređene direktorije koji čine put do datoteke. Ako sva kreiranja uspiju, vratit će se true, inače false (čak ako su neka i uspjela).

public boolean renameTo(File destination) throws SecurityException

Metoda renameTo() pokušava preimenovati datoteku. Na primjer, f1.renameTo(f2) pokušava preimenovati f1 u f2. To može značiti i premiještanje u drugi direktorij ako imena tako naznačuju. Ako f2 već postoji, bit će prebrisana sa f1 (pod uvjetom da imate odgovarajuće dozvole). Ako preimenovanje uspije, vraća se true, inače false.

public String[] list() throws SecurityException

Metoda list() vraća niz struna koje sadrže imena datoteka u navedenom direktoriju. Korisna je za procesiranje svih datoteka unutar direktorija odjednom.

public String[] list(FilenameFilter filter) throws SecurityException

Ova varijanta metode list() čini isto što i prethodna, ali možete koristiti objekt koji implementira sučelje FilenameFilter za filtriranje imena datoteka.

public boolean delete() throws SecurityException

Metoda delete() pokušava izbrisati datoteku na koju se odnosi. Vraća true ako je datoteka postojala i sad je izbrisana, inače false.

Klasa File sadrži i uobičajene metode equals(), hashCode() i toString() koje se ponašaju točno onako kao što biste očekivali. Ne sadrži posebnu metodu clone().

Primjer: metode klase File

Sljedeći program čita imena fajlova s komandne linije i vraća razne informacije o njima, koristeći metode iz klase File.

import java.io.*;

public class FileInfo {

  public static void main(String[] args) {

     for (int i = 0; i < args.length; i++) {
      File f = new File(args[i]);
      if (f.exists()) {
        System.out.println("getName: " + f.getName());
        System.out.println("getPath: " + f.getPath());
        System.out.println("getAbsolutePath: " + f.getAbsolutePath());
        try {
          System.out.println("getCanonicalPath: " + f.getCanonicalPath());
        }
        catch (IOException e) {
        }
        System.out.println("getParent: " + f.getParent());
        if (f.canWrite()) System.out.println(f.getName() + " is writable.");
        if (f.canRead()) System.out.println(f.getName() + " is readable.");
        if (f.isFile()) {
           System.out.println(f.getName() + " is a file.");
        }
        else if (f.isDirectory()) {
          System.out.println(f.getName() + " is a directory.");
        }
        else {
          System.out.println("What is this?");
        }
        if (f.isAbsolute()) {
          System.out.println(f.getName() + " is an absolute path.");
        }
        else {
          System.out.println(f.getName() + " is not an absolute path.");
        }
        System.out.println("Last Modified" + f.lastModified());
        System.out.println(f.getName() + " is " + f.length() + " bytes.");
      } else {
         System.out.println("I'm sorry. I can't find the file " + args[i]);
       }
     }

   }

}
% javac FileInfo.java
% java FileInfo "../html/TricksterApplet.html"
getName: TricksterApplet.html
getPath: ../html/TricksterApplet.html
getAbsolutePath: /math/vedris/public_html/java/classes/../html/TricksterApplet.html
getCanonicalPath: /math/vedris/public_html/java/html/TricksterApplet.html
getParent: ../html
TricksterApplet.html is writable.
TricksterApplet.html is readable.
TricksterApplet.html is a file.
TricksterApplet.html is not an absolute path.
Last Modified1005656988000
TricksterApplet.html is 151 bytes.

Izvor: Elliotte Rusty Harold, Java Lecture Notes, preveo Draško Budin, priredio Damjan Pavlica.