"Buna, Amigo. Mult timp, nu ne vedem."

"Bună, Bilaabo. Despre ce ai de gând să vorbești?"

„Astăzi am să vă spun despre lucrul cu fișierele.  Java are o clasă specială (File) pe care o puteți folosi pentru a gestiona fișierele de pe un hard disk. Pentru gestionarea conținutului fișierelor, există și alte clase: FileInputStream, FileOutputStream etc. "

Fișier, Fișiere, Cale - 1

„Interesant. Dar când spui „gestionează fișierele”, ce vrei să spui?”

„Tocmai asta voi explica acum. Fișierele pot fi create, șterse, redenumite și multe altele. Puteți trece un obiect File la practic fiecare clasă care lucrează cu (citește, scrie, modifică) conținutul unui fișier. . De exemplu:"

Puteți transmite numele fișierului direct către FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Sau puteți crea un obiect Fișier separat și apoi îl puteți transmite către FileInputStrrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Dar a doua opțiune este mai lungă. Încă nu înțeleg de ce avem nevoie de aceste obiecte fișier."

„Pentru acest exemplu specific, ai dreptate. „Acesta nu este un exemplu despre cum trebuie să o faci, ci mai degrabă cum o poți face.
Dar imaginați-vă că trebuie să afișați o listă cu toate fișierele aflate într-un anumit director. Iată cum se poate face acest lucru folosind obiecte File:"

Cod
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

„Este listFiles() o metodă care returnează o listă de fișiere în folderul indicat de «c:/path/»?"

„Da. Dar programatorii spun de obicei „director”. Termenul „dosar” a intrat în uz relativ recent, dar, în principiu, ambii termeni sunt corecti și poți spune pe care îl preferi.”

"OK. Și ce face getName ()? Returnează numele fișierului? Ce anume este inclus în nume? Numele complet, inclusiv calea, sau doar numele fișierului în sine?"

„Doar numele fișierului în sine. Pentru calea completă, există file.getAbsolutePath().”

„Deci ce alte metode are clasa File?”

"Uita-te la asta:"

Metodă Descriere
boolean isDirectory() Este obiectul Fișier un director?
boolean isFile() Este obiectul un fișier?
long length() Returnează dimensiunea/lungimea fișierului în octeți.
boolean createNewFile() Creează un fișier nou, gol, dacă un fișier cu acest nume nu există încă.
boolean mkdir() Creează un director. Numele «mkdir» provine de la «make directory».
boolean mkdirs() Creează un director și toate subdirectoarele acestuia.
boolean delete() Șterge fișierul asociat cu obiectul. Dacă obiectul este un director, atunci directorul este șters numai dacă nu există fișiere în el.
void deleteOnExit() Adaugă fișierul la o listă specială de fișiere care vor fi șterse automat la ieșirea programului.
File createTempFile(
String prefix,
String suffix,
File directory)
Creează un fișier temporar cu un nume unic generat aleatoriu, ceva de genul «dasd4d53sd».
Parametrii suplimentari sunt un prefix de nume și un sufix. Dacă nu este specificat un director, atunci fișierul este creat într-un director special al sistemului de operare pentru fișierele temporare.
boolean exists() Returnează true dacă pe hard disk există un fișier cu același nume.
String getAbsolutePath() Returnează calea completă a fișierului cu toate subdirectoarele sale.
String getCanonicalPath() Returnează calea fișierului canonic.
De exemplu, convertește calea «c:/dir/dir2/../a.txt» în «c:/dir/a.txt»
String[] list() Returnează o matrice cu numele fișierelor conținute în directorul reprezentat de obiectul curent.
File[] listFiles() Returnează o matrice de fișiere conținute în directorul reprezentat de obiectul actual File.
long getTotalSpace() Returnează cantitatea de spațiu total (numărul de octeți) de pe discul pe care se află fișierul.
long getFreeSpace() Returnează cantitatea de spațiu liber (numărul de octeți) de pe discul pe care se află fișierul.
boolean renameTo(File) Redenumește fișierul, adică conținutul fișierului primește de fapt un nou nume. Cu alte cuvinte, puteți redenumi fișierul «c:/dir/a.txt» în «d:/out/text/b.doc».
String getName() Returnează numai numele fișierului fără calea.
String getParent() Returnează doar calea (directorul) către fișierul curent, fără numele în sine.
Path toPath() Returnează un obiect Path care corespunde obiectului File curent.

"Uau! Nu este o listă foarte mică, nu? Și se pare că poți face destul de multe cu ea: creați și ștergeți fișiere, redenumiți-le,..."

„Deci, pentru a obține directorul fișierului curent, trebuie să apelez getParent()?”

„Da, dar returnează un String – calea fișierului – nu un obiect File. De fapt, clasa File dublează aproape toate metodele sale: o versiune returnează un String, cealaltă – un obiect File. Verificați:”

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Dacă aveți un String cu calea fișierului și aveți nevoie de un obiect File , atunci utilizați constructorul. Dacă situația este inversată (aveți un obiect File , dar aveți nevoie de un String), atunci utilizați getAbsolutePath (). De exemplu:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"Am înţeles."

"Genial. Atunci iată o mică sarcină pentru tine: arătați numele tuturor fișierelor aflate în același director cu fișierul curent."

"Nimic nu ar putea fi mai ușor. Iată, uite:"

Cod
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

— Hmm. Corect.

„Dar este puțin confuz faptul că aceeași clasă ― File ― este folosită atât pentru fișier, cât și pentru director. Nu mi se pare foarte logic.

„Așa a funcționat din motive istorice. Un director era un fișier special „gol” pe disc. Desigur, acum s-au schimbat multe, dar nu totul. Asta este tot ce am astăzi”.

— Mulțumesc pentru lecția interesantă, Bilaabo.