1. File sinfi: hər şey necə başladı
Yeni layihələrdə File sinfini istifadə etməməyin daha yaxşı olduğunu artıq müəyyən etsək də, hələ də ondan istifadə olunan çoxlu legacy‑sistemlər var. Buna görə onu anlamaq və onunla işləməyi bacarmaq vacibdir. File sinfi diskte faylı və ya direktoriyanı təqdim etməyin köhnə yoludur. Amma çaşdırmayın: File obyekti faylın özü deyil, sadəcə «göstərici»/yol pasportudur. Məsələn, ifadə File f = new File("hello.txt"); diskdə fayl yaratmır — siz sadəcə yolu təsvir etdiniz.
File obyektini necə yaratmalı?
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
File file = new File("example.txt"); // nisbi yol
File folder = new File("mydir"); // direktoriya
System.out.println("Mütləq yol: " + file.getAbsolutePath());
System.out.println("Fayl mövcuddurmu? " + file.exists());
System.out.println("Bu fayldır? " + file.isFile());
System.out.println("Bu direktoriyadır? " + folder.isDirectory());
}
}
Vacib məqamlar:
File obyektinin yaradılması diskdə fayl yaratmır. Bu sadəcə «qısayol»dur. Faylın həqiqətən yaranması üçün yaradılmanı açıq şəkildə başladmaq lazımdır (məsələn, məlumat yazmaq və ya file.createNewFile() çağırmaq).
File sinfinin əsas metodları
- exists() — faylın/direktoriyanın mövcud olub‑olmadığını yoxlayır.
- isFile() — bu fayldır (qovluq deyil)?
- isDirectory() — bu direktoriyadır?
- getAbsolutePath() — mütləq yolu əldə etmək.
- length() — faylın ölçüsü, baytla.
- getName() — faylın və ya qovluğun adı.
- delete() — fayl/direktoriyanı silmək (boşdursa).
Nümunə: fayl haqqında məlumatı çıxarırıq
File file = new File("example.txt");
System.out.println("Ad: " + file.getName());
System.out.println("Yol: " + file.getAbsolutePath());
System.out.println("Ölçü: " + file.length() + " bayt");
System.out.println("Mövcuddur? " + file.exists());
2. Path sinfi: fayllara müasir baxış
Path — yeni fayl API-sinin (NIO.2, Java 7‑dən) bir hissəsidir. Bu, fayla/direktoriyaya aparan yolun abstraksiyasıdır; yol təkcə yerli diskdə deyil, məsələn, ZIP arxivinin içində və ya uzaq resursda da ola bilər (uyğun provayder olduqda).
Əgər File köhnə kağız xəritədirsə, Path — GPS‑naviqatordur.
Path obyektini necə yaratmalı?
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
public static void main(String[] args) {
Path path1 = Paths.get("example.txt"); // nisbi yol
Path path2 = Paths.get("folder", "file.txt"); // yol hissələrini birləşdiririk
System.out.println("Yol 1: " + path1.toAbsolutePath());
System.out.println("Yol 2: " + path2.toAbsolutePath());
}
}
Üstünlük: ayırıcılara görə düşünməyə ehtiyac yoxdur. Paths.get sizin ƏS üçün düzgün formatı seçəcək.
File və Path arasında çevirmə
- File → Path: file.toPath()
- Path → File: path.toFile()
File file = new File("test.txt");
Path path = file.toPath();
Path anotherPath = Paths.get("data.txt");
File anotherFile = anotherPath.toFile();
Yollarla iş: resolve, relativize, normalize
Yolların birləşdirilməsi (resolve)
Path dir = Paths.get("myfolder");
Path file = dir.resolve("notes.txt"); // myfolder/notes.txt
System.out.println(file); // myfolder/notes.txt
Nisbi yol (relativize)
Path pathA = Paths.get("folderA/file1.txt");
Path pathB = Paths.get("folderA/subfolder/file2.txt");
Path relative = pathA.relativize(pathB);
System.out.println(relative); // ../subfolder/file2.txt
Yolun normallaşdırılması (normalize)
Path messy = Paths.get("folder/../folder/file.txt");
Path clean = messy.normalize();
System.out.println(clean); // folder/file.txt
Nümunə: fayla yol qururuq
Path home = Paths.get(System.getProperty("user.home"));
Path docs = home.resolve("Documents");
Path myFile = docs.resolve("myfile.txt");
System.out.println("Fayla yol: " + myFile.toAbsolutePath());
3. Files sinfi: sizin İsveçrə bıçağınız
java.nio.file paketindən Files sinfi Path üzərində fayl və direktoriyalarla işləmək üçün statik metodlardan ibarət utilit dəstidir. O, demək olar ki, hər şeyi bacarır: mövcudluğu yoxlamaq, yaratmaq/silmək, oxumaq/yazmaq, kopyalamaq/daşımaq, atributları əldə etmək və qovluq ağacını gəzib keçmək.
Files sinfinin əsas metodları
- Files.exists(path) — faylın/direktoriyanın mövcudluğunu yoxlayır.
- Files.isDirectory(path) — bu direktoriyadır?
- Files.size(path) — faylın ölçüsü.
- Files.createFile(path) — fayl yaratmaq.
- Files.createDirectory(path) — direktoriya yaratmaq.
- Files.delete(path) — faylı/direktoriyanı silmək.
- Files.copy(src, dest) — faylı kopyalamaq.
- Files.move(src, dest) — daşımaq/adını dəyişmək.
- Files.getLastModifiedTime(path) — son dəyişiklik vaxtı.
- Files.readAllBytes(path) — bütün faylı bayt massivinə oxumaq.
- Files.readAllLines(path) — mətn faylının bütün sətirlərini oxumaq.
- Files.write(path, bytes) — baytları fayla yazmaq.
Nümunə: faylı yoxlayırıq
import java.nio.file.*;
public class FilesDemo {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
System.out.println("Fayl mövcuddur? " + Files.exists(path));
System.out.println("Bu direktoriyadır? " + Files.isDirectory(path));
if (Files.exists(path)) {
try {
System.out.println("Faylın ölçüsü: " + Files.size(path) + " bayt");
} catch (Exception e) {
System.out.println("Ölçünü alarkən xəta: " + e.getMessage());
}
}
}
}
4. Təcrübə: obyektlər yaradırıq, xassələri göstəririk
Fayl və direktoriya üçün obyektlər yaradırıq
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CompareDemo {
public static void main(String[] args) {
// Köhnə üsul
File oldFile = new File("test.txt");
File oldDir = new File("mydir");
// Yeni üsul
Path newFile = Paths.get("test.txt");
Path newDir = Paths.get("mydir");
System.out.println("=== File API ===");
System.out.println("Fayl: " + oldFile.getAbsolutePath());
System.out.println("Mövcuddur? " + oldFile.exists());
System.out.println("Bu fayldır? " + oldFile.isFile());
System.out.println("Bu direktoriyadır? " + oldDir.isDirectory());
System.out.println("\n=== Path API ===");
System.out.println("Fayl: " + newFile.toAbsolutePath());
System.out.println("Mövcuddur? " + java.nio.file.Files.exists(newFile));
System.out.println("Bu fayldır? " + java.nio.file.Files.isRegularFile(newFile));
System.out.println("Bu direktoriyadır? " + java.nio.file.Files.isDirectory(newDir));
}
}
Faylın xassələrini göstəririk
import java.nio.file.*;
public class FileProperties {
public static void main(String[] args) {
Path path = Paths.get("test.txt");
System.out.println("Mütləq yol: " + path.toAbsolutePath());
System.out.println("Faylın adı: " + path.getFileName());
System.out.println("Valideyn qovluq: " + path.getParent());
if (Files.exists(path)) {
try {
System.out.println("Ölçü: " + Files.size(path) + " bayt");
System.out.println("Son dəyişiklik: " + Files.getLastModifiedTime(path));
} catch (Exception e) {
System.out.println("Məlumatı alarkən xəta: " + e.getMessage());
}
} else {
System.out.println("Fayl tapılmadı.");
}
}
}
5. Müqayisə: File vs Path/Files
| İmkan | File (java.io) | Path + Files (java.nio.file) |
|---|---|---|
| Yolun təqdimatı | Yalnız yerli disk | Yerli disk, ZIP, şəbəkə resursları |
| Yolların birləşdirilməsi | Slaşlar vasitəsilə əl ilə birləşdirmə | Rahat şəkildə resolve ilə |
| Mövcudluğun yoxlanması | exists() | Files.exists(path) |
| Məzmunu oxuma/yazma | Xeyr | Bəli (Files.readAll..., Files.write) |
| Atributların əldə edilməsi | Baza (length(), lastModified()) | Genişləndirilmiş atributlar və təqdimatlar |
| Uyğunluq | Java-nın bütün versiyaları ilə | Java 7 və yuxarı |
| Simvolik keçidlərlə iş | Məhdud | Tam dəstək |
Qısa olaraq: nə zaman nəyi istifadə etməli?
- Yeni layihələr üçün — Path və Files istifadə edin.
- Köhnə kodu dəstəkləmək üçün — bəzən File ilə işləməli olacaqsınız.
6. Faydalı nüanslar
Nisbi və mütləq yollar
Nisbi yol — cari işçi direktoriyaya görə olan yoldur; mütləq yol — fayl sisteminin kökündən başlayan tam yoldur.
Path relative = Paths.get("data", "file.txt");
Path absolute = relative.toAbsolutePath();
System.out.println("Mütləq yol: " + absolute);
Çarpaz platforma uyğunluğu
Path və Files ƏS xüsusiyyətlərini nəzərə alır (ayırıcilar, kodlaşdırmalar və s.). Yolları əl ilə "C:\\folder\\file.txt" kimi yazmayın — Paths.get və resolve istifadə edin.
File və Path arasında çevirmə
Əgər sizdə File üzərində köhnə kod varsa, asanlıqla yeni API‑yə keçmək olar:
File legacy = new File("legacy.txt");
Path modern = legacy.toPath();
if (Files.exists(modern)) {
// İndi NIO.2-nin bütün imkanlarından istifadə etmək olar
}
Faylın mövcudluğunu yoxlamaq
Path path = Paths.get("notes.txt");
if (Files.exists(path)) {
System.out.println("Fayl tapıldı!");
} else {
System.out.println("Fayl mövcud deyil.");
}
7. Mini‑praktika: fayl və direktoriyanı yaradır və yoxlayırıq
import java.nio.file.*;
public class MiniPractice {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("demo_dir");
Path file = dir.resolve("hello.txt");
// Direktoriyanı, əgər yoxdursa, yaradırıq
if (!Files.exists(dir)) {
Files.createDirectory(dir);
System.out.println("Direktoriya yaradıldı: " + dir.toAbsolutePath());
}
// Faylı, əgər yoxdursa, yaradırıq
if (!Files.exists(file)) {
Files.createFile(file);
System.out.println("Fayl yaradıldı: " + file.toAbsolutePath());
}
// Xüsusiyyətləri göstəririk
System.out.println("Fayl mövcuddur? " + Files.exists(file));
System.out.println("Bu fayldır? " + Files.isRegularFile(file));
System.out.println("Ölçü: " + Files.size(file) + " bayt");
// Faylı və direktoriyanı silirik (istəyə görə)
Files.delete(file);
Files.delete(dir);
System.out.println("Fayl və direktoriya silindi.");
}
}
8. File/Path/Files ilə işləyərkən tipik səhvlər
Xəta №1: File ilə Path arasında qarışıqlıq. Bir çox yeni başlayanlar Files metodlarını File obyekti ilə istifadə etməyə çalışır. Unutmayın: Files.* Path ilə işləyir. Əgər sizin File‑nız varsa, əvvəlcə file.toPath() edin.
Xəta №2: File və ya Path obyektinin yaradılmasının faylı da yaradacağını gözləmək. Yol obyekti — qısayoldur, real fayl deyil. Yaratmaq üçün Files.createFile(path) və ya məlumat yazmağından istifadə edin.
Xəta №3: Yolları sətirlə əl ilə yığmaq. "folder/file.txt" və ya "folder\\file.txt" yazmayın. Paths.get(...) və resolve(...) istifadə edin. Bu, daha təhlükəsizdir və çarpaz platformadır.
Xəta №4: İstisnaların görməzlikdən gəlməsi. Fayllarla əməliyyatlar IOException və digər istisnalar ata bilər. Onları try-catch vasitəsilə emal edin və ya yuxarıya ötürün (throws).
Xəta №5: File.exists() ilə yoxlama, sonra Path ilə işləmək. Bir üsluba sadiq qalmağa çalışın: Path ilə başlamısınızsa — Files.exists(path) və Files metodlarının qalanını istifadə edin.
GO TO FULL VERSION