Professional Documents
Culture Documents
Kreiranje fajla
Konstruktor za neki određeni fajl prima kao argument putanju do datog fajla, odnosno potencijalnu
putanju gde se taj fajl nalazi. Program ne može da zna da li taj fajl zaista postoji. Pretpostavimo da
nam je u zadatku dato da napravimo novi tekstualni fajl (File klasa ne brine se o ekstenziji fajla,
odnosno možemo da kreiramo bilo koji tip!).
Za početak kreirajmo fajl „test.txt“. Prvi korak je kreiranje putanje ka datom fajlu:
File f = new File("test.txt");
Ovim smo ostvarili samo relaciju između objekta u Javi, ali i dalje nemamo dokaze da dati fajl postoji.
Metoda koju možemo da iskoristimo je createNewFile() koja će kreirati fizičku reprezentaciju fajla na
našem računaru. Metoda vraća true ako može da kreira fajl, a false ako nije uspešno kreiran fajl. Ova
metoda takođe može baciti izuzetak IOException pa je potrebno kreiranje fajla i dalje funkcionalnosti
nad njim da izvršavamo unutar try/catch bloka. Kod za kreiranje prvog fajla glasi:
import java.io.*;
public class JAVA_Fajlovi {
public static void main(String[] args) {
try {
File f = new File("test.txt");
if(f.createNewFile()) {
System.out.println("Fajl je uspešno kreiran!");
} else {
System.out.println("Fajl ne može biti kreiran!");
}
} catch (IOException ex) {
System.err.println("Greška: " + ex);
}
}
}
Kada se pokrene program dobijamo poruku u terminalu:
Fajl je uspešno kreiran!
Kako ne znamo gde se nalazi naš novo kreirani fajl, možemo dobiti fizičku lokaciju koristeći metodu
getAbsolutePath() koja će nam vratiti fizičku putanju za dati fajl. Prvo treba obrisati već kreirani txt fajl
i on se nalazi u okviru vašeg projekta. Sada ispod poruke o uspešno kreiranom fajlu treba dodati
sledeći kod za prikaz absolutne putanje:
Objektno orijentisano projektovanje, VIŠER 2015
if(f2.exists()) {
System.out.println("Fajl f2 je datoteka: " + f2.isFile());
System.out.println("Fajl f2 je direktorijum: " + f2.isDirectory());
}
Brisanje fajla / foldera
Metoda za brisanje fajla, odnosno foldera je delete(). Implementacija koda je sledeća:
File f = new File("test.txt");
if(f.exists()) {
if(f.delete()) {
System.out.println("Fajl je obrisan!");
}
}
Izlistavanje fajlova i foldera
Da bi se izlistali fajlovi i direktorijumi, postoji naredba list() koja će za dati direktorijum vratiti niz
stringova sa imenima fajlova i direktorijuma koji se u njemu nalaze. Dat je primer sa folderom
„test_folder“ koji ima sledeću strukturu:
Ovo su neke osnovne funkcije koje se odnose na rad sa fajlovima i folderima. U nastavku ćemo videti
kako da čitamo i upisujemo sadržaj iz tekstualnih datoteka
Problem sa ovakvim načinom čitanja je da sam niz bajtova koji kreiramo može biti i nekoliko puta
veći od veličine naše datoteke. Ova način se preporučuje kada znate da raditi sa datotekama malih
veličina ili raspoloživim memorijskim prostorom.
Objektno orijentisano projektovanje, VIŠER 2015
Drugi način na koji možemo da čitamo datoteke je korišćenjem BufferedReader klase. Korišćenje
ovog metoda zahteva i dodatne klase pa je potrebno da razjasniti šta koja klasa radi. Prva klasa koju
moramo da koristimo je FileInputStream. Ova klasa u konstruktoru prima fajl (objekat File klase) sa
kojim želimo da komuniciramo. Ovim se otvara tok, odnosno konekcija sa datim fajlom. Dok je ovaj
tok otvoren drugi korisnici ne mogu da pristupaju tom fajlu. Sledeća klasa je InputStreamReader koja
služi da čita podatke iz toka. Ulazni parametar je objekat tipa InputStream odnosno FileInputStream
u našem slučaju. Ova klasa čita bajtove (ovu klasu možemo koristiti kao i u slučaju za čitanje celog
sadržaja zbog ove mogućnosti) što nama ne odgovara ako već želimo da čitamo svaki red datoteke.
Zbog toga potrebno je te bajtove konvertovati u smislene podatke. BufferedReader ima metodu
readLine() koja će da interpretira niz byte-ova do byte-a koji označava prelazak u novi red, odnosno
čitaće podatke red po red. Čitanje reda će se obaviti smeštanjem sadržaja u pomoćnu promenljivu
sve dok sadržaja ima. Kada to ne bude bio slučaj, znači da smo došli do kraja fajla. Kod izgleda ovako:
try {
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-
8"));
BufferedReader bfr = new BufferedReader(isr);
Ovde postoje dve stvari sa kojima se srećemo. Prva je System.getProperty() koja će nam vratiti
interpretaciju neke funkcionalnosti vezane za operativni sistem ili program. Na primer ako znati
putanje u UNIX baziranim operativnim sistemima idu kao /home/korisnik/etc dok u windowsu
C:\users\korisnik. Treba primetiti da za jedan OS je putanja sa / a za drugi sa \. System.getProperty()
može za nas da kreira taj separator da bi bili sigurni da naša aplikacija radi nezavisno od platforme.
Primer bi bio System.getProperty("file.separator") + "do" + System.getProperty("file.separator") gde
je svojstvo file.separator ono koje obezbeđuje da se razlikuje da li je UNIX ili Windows baziran sistem.
Isto tako i line.separator će adaptirati kako da se upiše novi red u zavisnosti od tipa fajla.
Druga stvar je StandardOpenOption enumerator koji nam daje neke mogućnosti sa našim fajlom
između ostalog WRITE i APPEND opcije za pisanje u datoteku. Važno: WRITE će samo dodati novi
sadržaj na početak. Ako je taj sadržaj manji od starog, ostatak starog sadržaja ostaće posle novog.
Da bi se ovo izbeglo koristi se opcija TRUNCATE_EXISTING koja će obrisati sadržaj u datoteci.
Drugi način je korišćenjem klasa PrintWriter i FileWriter. FileWriter otvara tok ka fajlu u koji želimo da
upišemo sadržaj, dok PrintWriter zapravo nam omogućava da upišemo sadržaj. Kod je sledeći:
try {
FileWriter fw = new FileWriter("test.txt", false);
PrintWriter out = new PrintWriter(fw);
out.print("Neki string koji želimo da upišemo" +
System.getProperty("line.separator") + "Ima i više redova");
out.close();
fw.close();
} catch (IOException ex) {
System.err.println(ex);
}
U konstruktoru FileWriter-a stoji false, ovo znači da želimo da obrišemo stari sadržaj. Ako je stavljeno
false onda se briše stari sadržaj i dodaje novi na početak, a ako je true dodaje se sadržaj na kraj fajla.
Korišćenjem metode print možemo da upišemo sadržaj.