1. Təkrar: File vs Path vs Files
Köhnə, yaxşı File
Bəli... Java layihələrində legacy-kod kifayət qədərdir. Ona görə gəlin Java-nın veteranı, File sinfini bir daha yada salaq. O, dilin ilk versiyasında peyda olub və fayl və qovluqlarla işləməyə imkan verir: faylın mövcud olub-olmadığını, adını, ölçüsünü, dəyişdirilmə tarixini öyrənmək, fayl və qovluqları yaratmaq və silmək. Artıq bildiyimiz kimi, onun bir sıra çatışmazlıqları var: bəzi metodlar qeyri-intuitiv işləyir, bütün əməliyyatlar platformalararası dəstəklənmir və bəziləri istisna atmaq əvəzinə sadəcə false qaytarır (bu da hər zaman sazlama üçün rahat deyil).
import java.io.File;
File file = new File("example.txt");
System.out.println("Fayl mövcuddurmu? " + file.exists());
System.out.println("Bu fayldırmı? " + file.isFile());
System.out.println("Bu qovluqdurmu? " + file.isDirectory());
Path və Files: müasir yanaşma (Java 7+)
Java 7 ilə java.nio.file paketi yarandı və daha güclü, çevik alətlər təklif etdi. İki əsas qəhrəman:
- Path — fayl və ya qovluğa gedən yolu təsvir edən interfeys. Buna «ağıllı sətir» də demək olar: yolları parçalamağı, birləşdirməyi, təhlil etməyi, müqayisə etməyi bacarır.
- Files — fayl və qovluqlarla işləmək üçün çoxlu statik metodları olan utilitar sinif: yaratma, silmə, kopyalama, oxuma, yazma, məlumat əldə etmə.
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("example.txt");
System.out.println("Yol: " + path);
Maraqlı fakt: Path sinfi sadəcə sətir deyil! O, qovluq ayırıcılardan xəbərdardır, nisbi və mütləq yolları anlamağı bacarır və Windows ilə Linux-da eyni dərəcədə yaxşı işləyir.
File və Path/Files müqayisə cədvəli
| Meyar | File (köhnə API) | Path + Files (müasir API) |
|---|---|---|
| Sintaksis | OOP üslubu | Path + Files-in statik metodlarının kombinasiyası |
| Platformalararası uyğunluq | Qismən | Əla, ƏS-i nəzərə alır |
| İstisnalar | Həmişə deyil | Demək olar ki, həmişə |
| Yeni imkanlar | Yoxdur | Bəli (atributlar, icazələr, istinadlar və s.) |
| Tövsiyə olunur | Daha çox yox | Bəli |
2. Fayl/qovluq haqqında məlumat əldə etmə
Gəlin, fayl və ya qovluq barədə ən vacib məlumatları necə öyrənəcəyimizi anlayaq: obyektin mövcudluğu, tipi (fayl və ya qovluq), ölçüsü, adı, yolu və valideyn qovluğu.
Mövcudluğun yoxlanması
File vasitəsilə
File file = new File("example.txt");
if (file.exists()) {
System.out.println("Fayl mövcuddur!");
} else {
System.out.println("Fayl tapılmadı.");
}
Path və Files vasitəsilə
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("example.txt");
if (Files.exists(path)) {
System.out.println("Fayl mövcuddur!");
} else {
System.out.println("Fayl tapılmadı.");
}
Məsləhət: Yeni layihələr üçün həmişə Path və Files istifadə edin. Bu, daha təhlükəsiz, rahat və platformalararasıdır.
Tipin yoxlanması: fayl, yoxsa qovluq
File
if (file.isFile()) {
System.out.println("Bu fayldır.");
} else if (file.isDirectory()) {
System.out.println("Bu qovluqdur.");
}
Path + Files
if (Files.isRegularFile(path)) {
System.out.println("Bu fayldır.");
} else if (Files.isDirectory(path)) {
System.out.println("Bu qovluqdur.");
}
Fayl ölçüsünün əldə edilməsi
File
long size = file.length();
System.out.println("Faylın ölçüsü: " + size + " bayt");
Path + Files
try {
long size = Files.size(path);
System.out.println("Faylın ölçüsü: " + size + " bayt");
} catch (IOException e) {
System.out.println("Fayl ölçüsünü əldə edərkən xəta: " + e.getMessage());
}
Diqqət: Qovluq üçün length() metodu həmişə 0 qaytaracaq, Files.size(path) isə IOException atacaq. Qovluğun ölçüsü — içindəki bütün faylların ölçülərinin cəmidir (ətraflı — növbəti mühazirələrdə).
Mütləq və nisbi yolun əldə edilməsi
File
System.out.println("Nisbi yol: " + file.getPath());
System.out.println("Mütləq yol: " + file.getAbsolutePath());
Path
System.out.println("Nisbi yol: " + path);
System.out.println("Mütləq yol: " + path.toAbsolutePath());
Fayl adının və valideyn qovluğun əldə edilməsi
File
System.out.println("Fayl adı: " + file.getName());
System.out.println("Valideyn qovluq: " + file.getParent());
Path
System.out.println("Fayl adı: " + path.getFileName());
System.out.println("Valideyn qovluq: " + path.getParent());
Lifehack: Path təkcə fayllarla deyil, həm də qovluqlarla, nisbi və mütləq yollarla işləyir və yolu asanlıqla hissələrə ayıra bilir.
3. Fayl atributlarının əldə edilməsi
Bəzən faylın ölçüsü və adından əlavə daha maraqlı məlumatlar da lazımdır: yaradılma tarixi, son dəyişdirilmə tarixi, giriş icazələri.
Yaradılma və son dəyişdirilmə tarixi
File (məhdud)
long lastModified = file.lastModified();
System.out.println("Son dəyişdirilmə tarixi: " + new java.util.Date(lastModified));
Minus: File vasitəsilə faylın yaradılma tarixini öyrənmək mümkün deyil!
Path + Files
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
FileTime creationTime = attrs.creationTime();
FileTime lastModifiedTime = attrs.lastModifiedTime();
System.out.println("Yaradılma tarixi: " + creationTime);
System.out.println("Son dəyişdirilmə tarixi: " + lastModifiedTime);
} catch (IOException e) {
System.out.println("Atributları əldə edərkən xəta: " + e.getMessage());
}
Giriş icazələrinin yoxlanması
File
System.out.println("Oxumaq mümkündür? " + file.canRead());
System.out.println("Yazmaq mümkündür? " + file.canWrite());
System.out.println("İcra etmək mümkündür? " + file.canExecute());
Path + Files
System.out.println("Oxumaq mümkündür? " + Files.isReadable(path));
System.out.println("Yazmaq mümkündür? " + Files.isWritable(path));
System.out.println("İcra etmək mümkündür? " + Files.isExecutable(path));
Maraqlı fakt: Windows-da giriş icazələri məhduddur, Unix sistemlərində isə (məsələn, POSIX atributları vasitəsilə) daha çox icazəni almaq və dəyişmək mümkündür.
4. Fayllar haqqında məlumat alarkən tipik səhvlər
Səhv №1: Path lazım olduğu halda File istifadə etmək.
Bir çox yeni başlayanlar bunu daha asan olduğu üçün və ya «internetdə hər yerdə belədir» deyə hələ də File istifadə edirlər. Lakin Path və Files vasitəsilə eyni işləri daha etibarlı və müasir şəkildə görmək olar.
Səhv №2: Obyektin tipini yalnız File ilə yoxlamaq.
Yalnız file.isFile() və file.isDirectory() istifadə edirsinizsə, «xüsusi» faylları (simvolik linklər, cihazlar) gözdən qaçıra bilərsiniz. Müasir API-də Files.isRegularFile(path), Files.isDirectory(path) və digər yoxlamalar var.
Səhv №3: İstisnaları görməməzlikdən gəlmək.
Files.size(path) və Files.readAttributes(...) metodları IOException atır. İstisnaları emal etməsəniz, proqram ilk giriş xətasında və ya fayl iş zamanı yoxa çıxanda dərhal çökəcək.
Səhv №4: Qovluğun ölçüsünü birbaşa öyrənmək mümkün olduğunu güman etmək.
Files.size(path) metodu qovluq üçün istisna atacaq. Qovluğun ölçüsünü öyrənmək üçün içəridəki bütün faylların ölçülərini rekursiv toplamaq lazımdır.
Səhv №5: Giriş icazələrinin kifayət qədər yoxlanmaması.
Fayl mövcud olsa belə, onu oxumaq və ya yazmaq üçün icazələriniz olmaya bilər. Əməliyyatlardan əvvəl icazələri həmişə yoxlayın: Files.isReadable(path), Files.isWritable(path), Files.isExecutable(path).
GO TO FULL VERSION