1. Faylların yaradılması
Faylları proqram vasitəsilə yaratmaq tez-tez lazım olur: jurnallar, müvəqqəti məlumatlar, hesabatların ixracı, məlumatların idxalı, ayarların saxlanması və daha nələr üçün. Java-da bunun üçün, yəqin ki, artıq təxmin etdiyiniz kimi, ən yaxşısı müasir API — java.nio.file-dən istifadə etməkdir.
Əsas vasitə: Files.createFile(Path)
Bu metod göstərilən yol üzrə yeni fayl yaradır. Fayl artıq mövcuddursa, istisna atılacaq.
Nümunə: cari qovluqda mətn faylı yaradırıq
import java.nio.file.*;
public class CreateFileExample {
public static void main(String[] args) {
Path path = Path.of("hello.txt");
try {
Files.createFile(path);
System.out.println("Fayl yaradıldı: " + path.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
System.out.println("Fayl artıq mövcuddur: " + path);
} catch (Exception e) {
System.out.println("Faylın yaradılması zamanı xəta: " + e.getMessage());
}
}
}
Diqqət yetirin:
Files.createFile fayl artıq varsa FileAlreadyExistsException atır. Buna görə də çox vaxt faylı yaratmazdan əvvəl onun mövcudluğunu yoxlayırlar.
Faylın mövcudluğunu yoxlama
Path path = Path.of("hello.txt");
if (!Files.exists(path)) {
Files.createFile(path);
}
Məsləhət:
Faylın mövcudluğunu yoxlama — bu, axınlar arasında yarış vəziyyətinə qarşı müdafiə deyil, lakin əksər istifadəçi ssenariləri üçün kifayət qədər işlək üsuldur.
Qısa olaraq: fayl yaradılarkən nə baş verir?
- Fayl mövcud deyilsə və yol düzgündürsə — yeni boş fayl yaradılır.
- Fayl artıq varsa — istisna atılır.
- Yol səhvidirsə, icazələr yoxdursa və ya qovluq mövcud deyilsə — başqa bir istisna atılacaq (IOException, NoSuchFileException və s.).
2. Qovluqların yaradılması
Files.createDirectory və Files.createDirectories arasındakı fərq
- Files.createDirectory(Path) — yalnız bir qovluq yaradır. Valideyn qovluq yoxdursa — xəta olacaq.
- Files.createDirectories(Path) — çatışmayan bütün qovluqlar zəncirini yaradır (elə bil ayaqlarınızın altında pilləkən quran sehrbaz kimi).
Nümunə: bir qovluq yaradırıq
Path dir = Path.of("data");
try {
Files.createDirectory(dir);
System.out.println("Qovluq yaradıldı: " + dir.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
System.out.println("Qovluq artıq mövcuddur: " + dir);
} catch (Exception e) {
System.out.println("Qovluğun yaradılması zamanı xəta: " + e.getMessage());
}
Nümunə: iç-içə qovluq strukturu yaradırıq
Path nested = Path.of("data/reports/2024");
try {
Files.createDirectories(nested);
System.out.println("Qovluqlar strukturu yaradıldı: " + nested.toAbsolutePath());
} catch (Exception e) {
System.out.println("Struktur yaradılarkən xəta: " + e.getMessage());
}
Nəzərə alın: qovluqlardan biri artıq mövcuddursa, createDirectories üçün bu problem deyil — sadəcə çatışmayanları yaradır. Əgər createDirectory iç qovluq üçün istifadə etsəniz, amma valideyn hələ yoxdursa — xəta alınacaq.
Cədvəl: qovluq yaratma metodlarının müqayisəsi
| Metod | Yalnız bir qovluq yaradır | İç-içə qovluqlar yaradır | Zəncirin bir hissəsi artıq varsa, xəta vermir |
|---|---|---|---|
|
✔ | ✗ | ✗ |
|
✔ | ✔ | ✔ |
3. Faylların silinməsi
Faylları silmək demək olar ki, zibil atmaq kimidir: əsas məsələ — vacib bir şeyi atıb getməməkdir! Java-da bunun üçün iki əsas metod var:
- Files.delete(Path) — faylı və ya boş qovluğu silir. Fayl yoxdursa — istisna atılır.
- Files.deleteIfExists(Path) — faylı silir, lakin o yox idisə — səssizcə heç nə etmir.
Nümunə: müvəqqəti faylı silirik
Path tempFile = Path.of("temp.txt");
try {
Files.delete(tempFile);
System.out.println("Fayl silindi: " + tempFile);
} catch (NoSuchFileException e) {
System.out.println("Fayl tapılmadı: " + tempFile);
} catch (DirectoryNotEmptyException e) {
System.out.println("Qovluq boş deyil: " + tempFile);
} catch (Exception e) {
System.out.println("Silmə zamanı xəta: " + e.getMessage());
}
Daha təhlükəsiz variant
boolean deleted = Files.deleteIfExists(tempFile);
if (deleted) {
System.out.println("Fayl silindi.");
} else {
System.out.println("Fayl tapılmadı — silinəcək heç nə yoxdur.");
}
Vacibdir!
- Fayl başqa proqramda açıqdırsa — istisna atıla bilər (məsələn, Windows-da).
- Boş olmayan qovluğu silməyə cəhd etsəniz — DirectoryNotEmptyException xətası yaranacaq.
4. Qovluqların silinməsi
Qovluqları Java-da təxminən fayllar kimi silirik. Yeganə nüans: standart metodlar yalnız boş qovluqları silir.
Nümunə: boş qovluğu silirik
Path emptyDir = Path.of("empty_folder");
try {
Files.delete(emptyDir);
System.out.println("Qovluq silindi: " + emptyDir);
} catch (DirectoryNotEmptyException e) {
System.out.println("Qovluq boş deyil: " + emptyDir);
} catch (NoSuchFileException e) {
System.out.println("Qovluq tapılmadı: " + emptyDir);
} catch (Exception e) {
System.out.println("Qovluğun silinməsi zamanı xəta: " + e.getMessage());
}
Boş olmayan qovluqlarla nə etmək lazımdır?
Boş olmayan qovluqları silmək üçün bütün daxil olan fayl və alt qovluqları rekursiv şəkildə silmək lazımdır. Bu, ayrıca mühazirənin mövzusudur (və ayrıca bir macəra), amma tələssəniz, buyurun kod — araşdırın və təkrarlamağa çalışın:
import java.nio.file.*;
import java.io.IOException;
public class DeleteDirectoryRecursively {
public static void deleteRecursively(Path path) throws IOException {
if (Files.isDirectory(path)) {
try (var entries = Files.list(path)) {
for (Path entry : entries.toList()) {
deleteRecursively(entry);
}
}
}
Files.delete(path);
}
}
Diqqət:
Bu kod qovluğun içində olan hər şeyi siləcək! Ehtiyatla istifadə edin.
5. Praktik məsləhətlər
Silməzdən əvvəl mövcudluğu yoxlama
if (Files.exists(path)) {
Files.delete(path);
} else {
System.out.println("Fayl/qovluq mövcud deyil.");
}
Amma əgər deleteIfExists istifadə edirsinizsə, bunu etmək vacib deyil.
İstisnaların emalı
Fayllarla işləyərkən tez-tez gözlənilməz hallar olur. Java bunun üçün müxtəlif istisnalar atır:
- NoSuchFileException — fayl və ya qovluq tapılmadı. Məsələn, artıq sildiyiniz bir şeyi açmağa çalışırsınız.
- DirectoryNotEmptyException — qovluğu silmək istəyirsiniz, amma içində hələ nəsə var.
- IOException — ümumi bildiriş: nəsə yolunda getmədi. Səbəb müxtəlif ola bilər — giriş icazəsi yoxdur, fayl başqa proqram tərəfindən istifadə olunur, yol səhvdir.
Vizual sxem: əsas metodlar
+-------------------+ +--------------------+
| Files.createFile | ----> | Yeni fayl |
+-------------------+ +--------------------+
+---------------------+ +--------------------+
| Files.createDirectory|----> | Yeni qovluq |
+---------------------+ +--------------------+
+-------------------+ +--------------------+
| Files.delete | ----> | Fayl/qovluq silindi |
+-------------------+ +--------------------+
(amma yalnız qovluq boşdursa!)
6. Fayl və qovluqların yaradılması və silinməsində tipik səhvlər
Səhv №1: Artıq mövcud olan fayl/qovluğu yaratmağa çalışırıq. Files.createFile və Files.createDirectory metodları obyekt artıq varsa istisna atır. Həll — əvvəlcədən mövcudluğu yoxlamaq və ya istisnanı tutmaq.
Səhv №2: createDirectory ilə iç qovluq yaratmağa çalışırıq, amma valideyn hələ yoxdur. Bu halda NoSuchFileException xətası olacaq. Qovluqlar zəncirini yaratmaq üçün createDirectories istifadə edin.
Səhv №3: Files.delete ilə boş olmayan qovluğu silməyə çalışırıq. DirectoryNotEmptyException alacaqsınız. Boş olmayan qovluqları silmək üçün rekursiya lazımdır.
Səhv №4: Göstərilən qovluqda yaratmaq/silmək üçün icazə yoxdur. AccessDeniedException və ya IOException atılacaq. Proqramı lazımi səlahiyyətlərlə işə salın və ya əlçatan qovluqlardan istifadə edin.
Səhv №5: Fayl başqa proses tərəfindən istifadə olunur. Windows-da (və bəzən digər OS-lərdə) fayl başqa proqramda açıqdırsa, onu silmək olmur. IOException alacaqsınız. Silmədən əvvəl fayldan istifadə edən bütün tətbiqləri bağlayın.
Səhv №6: “Harada olduğunuzu” anlamadan nisbi yolların istifadəsi. Fayl gözlədiyiniz yerdə deyil, başqa yerdə yaradılır. Dəqiqlik üçün toAbsolutePath() istifadə edin və yolu ekrana çıxarın.
GO TO FULL VERSION