1. Direktoriyaların yaradılması
Direktoriya (yəni qovluq) fayllar üçün sadəcə konteyner deyil, diskte məlumatların təşkili üçün əsasdır. Tətbiqlərdə giriş/çıxış məlumatları, loqlar, müvəqqəti fayllar və s. üçün kataloqlar yaratmağa daim ehtiyac duyuruq. Müasir java.nio.file API bunu rahat və kross‑platformalı şəkildə edir.
Gəlin, Files, Path və Paths siniflərinin köməyi ilə qovluqları necə yaratmaq, silmək və məzmununa baxmaq olar, nəzərdən keçirək.
Files.createDirectory(path)
Göstərilən yolda bir direktoriya yaradır. Əgər valideyn direktoriya yoxdursa — istisna atılacaq.
import java.nio.file.*;
public class DirectoryDemo {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("testDir");
if (!Files.exists(dir)) {
Files.createDirectory(dir);
System.out.println("Direktoriya yaradıldı: " + dir.toAbsolutePath());
} else {
System.out.println("Direktoriya artıq mövcuddur: " + dir.toAbsolutePath());
}
}
}
Artıq mövcud olan direktoriyanı yaratmağa çalışsanız, FileAlreadyExistsException alacaqsınız.
Files.createDirectories(path)
Bütün direktoriyalar zəncirini yaradır. Aralıq kataloqlardan hansısa yoxdursa — o, avtomatik yaradılacaq. Zəncirin bir hissəsi artıq mövcuddursa — xəta olmayacaq.
Path nestedDir = Paths.get("parent/child/grandchild");
Files.createDirectories(nestedDir);
System.out.println("Direktoriyalar zənciri yaradıldı: " + nestedDir.toAbsolutePath());
Bu, sanki Java‑dan təkcə evi deyil, lazım gələrsə, onun üçün bütün infrastrukturu da qurmağı xahiş etmisiniz.
Tipik nümunə: layihə üçün strukturu yaradırıq
Tutaq ki, hesabatları output/reports/2024 qovluğuna saxlamaq lazımdır. Hər direktoriyanı ayrıca yoxlamayın — createDirectories istifadə edin.
Path reportsPath = Paths.get("output/reports/2024");
Files.createDirectories(reportsPath);
Java özü nə artıq mövcuddur, nə isə yaradılmalıdır — hamısını müəyyən edəcək.
2. Fayl və direktoriyaların silinməsi
Files.delete(path)
Faylı və ya boş direktoriyanı silir. Direktoriyanın içi boş deyilsə — DirectoryNotEmptyException atılacaq.
Path dir = Paths.get("testDir");
try {
Files.delete(dir);
System.out.println("Direktoriya silindi: " + dir.toAbsolutePath());
} catch (DirectoryNotEmptyException e) {
System.out.println("Silmək mümkün deyil: direktoriya boş deyil!");
}
Files.deleteIfExists(path)
delete kimi işləyir, amma obyekt yoxdursa xəta atmır. Nəticə true olduqda nəsə silinib, false olduqda obyekt mövcud olmayıb.
Path file = Paths.get("output/reports/2024/report.txt");
if (Files.deleteIfExists(file)) {
System.out.println("Fayl silindi.");
} else {
System.out.println("Fayl tapılmadı, heç nə silinmədi.");
}
Boş olmayan direktoriyanı necə silmək olar?
Boş olmayan qovluğu birbaşa silmək olmaz. Əvvəlcə bütün məzmunu (fayllar və alt direktoriyalar) silmək, sonra isə qovluğun özünü silmək lazımdır. Bu, rekursiv şəkildə, məsələn, Files.walkFileTree vasitəsilə edilir:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DeleteDirectoryRecursively {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("parent");
if (Files.exists(dir)) {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
System.out.println("Direktoriya və bütün məzmunu silindi.");
}
}
}
Yeni başlayırsınızsa, bu kod sizi qorxutmasın — walkFileTree-ni sonra daha ətraflı izah edəcəyik.
3. Direktoriyanın məzmununa baxış
Files.list(path)
Stream<Path> qaytarır — yollar axını. Qovluğun məzmununu Stream API vasitəsilə emal edə bilərsiniz. Hər yazı — fayl və ya alt direktoriya deməkdir (rekursiya yoxdur!).
Path dir = Paths.get("output/reports");
if (Files.exists(dir) && Files.isDirectory(dir)) {
try (var stream = Files.list(dir)) {
stream.forEach(path -> System.out.println(path.getFileName()));
}
}
Vacib məqam: axın mütləq bağlanmalıdır, buna görə try‑with‑resources istifadə edirik.
Nümunə: fayl və alt direktoriyaların adlarını çıxarırıq
Path reports2024 = Paths.get("output/reports/2024");
try (var stream = Files.list(reports2024)) {
stream.forEach(path -> {
String type = Files.isDirectory(path) ? "direktoriya" : "fayl";
System.out.println(path.getFileName() + " — " + type);
});
}
Faylların siyahısını kolleksiya kimi almaq
List<Path> files = Files.list(reports2024)
.filter(Files::isRegularFile)
.toList();
System.out.println("Qovluqdakı fayllar:");
files.forEach(System.out::println);
Vacibdir: Files.list(path) yalnız cari direktoriyanın (yuxarı səviyyə) məzmununu qaytarır. Rekursiv keçid üçün Files.walk(path) istifadə edin.
4. Təcrübə: mini‑fayl meneceri
Utilit mydata/logs direktoriyasını, log1.txt faylını yaradır, qovluğun məzmununu çıxarır və sonra hamısını silir.
import java.nio.file.*;
import java.io.IOException;
public class MiniFileManager {
public static void main(String[] args) throws IOException {
Path logsDir = Paths.get("mydata/logs");
Files.createDirectories(logsDir);
Path logFile = logsDir.resolve("log1.txt");
Files.writeString(logFile, "Salam, loq!");
System.out.println("Qovluğun məzmunu " + logsDir + ":");
try (var stream = Files.list(logsDir)) {
stream.forEach(path -> System.out.println(" - " + path.getFileName()));
}
Files.deleteIfExists(logFile);
Files.deleteIfExists(logsDir);
System.out.println("Fayl və qovluq silindi.");
}
}
Koda dair şərhlər:
- Files.createDirectories bütün zəncirin yaradılmasını təmin edir.
- resolve — fayl adını yola əlavə etməyin rahat yoludur.
- Files.list-dən gələn axını try‑with‑resources ilə bağlayırıq — xüsusilə Windows-da kritikdir.
5. Xüsusiyyətlər və incəliklər
Mövcudluğun yoxlanması
Yaratmadan/silmədən əvvəl yolun mövcud olub-olmadığını yoxlamaq faydalıdır:
if (!Files.exists(path)) {
Files.createDirectory(path);
}
Giriş icazələri
Proqramın yaratmaq/silmək üçün hüquqları yoxdursa — AccessDeniedException alacaqsınız. Məsələn, adi istifadəçi ilə disk kökündə qovluq yaratmaq demək olar ki, həmişə xətayla nəticələnir.
Boş və boş olmayan direktoriya
Yalnız boş direktoriyanı silmək mümkündür (Files.delete). Məzmunu ilə birlikdə silmək üçün rekursiv keçiddən istifadə edin (walkFileTree).
Kross‑platformalıq
java.nio.file API bütün populyar OS‑lərdə düzgün işləyir və yol ayırıcılarını nəzərə alır. Yolları qurmaq üçün Paths.get və Path.resolve istifadə edin, sətirləri sadəcə birləşdirməyin.
Simvolik keçidlər
Baza tapşırıqlarında onlar barədə düşünməyə ehtiyac yoxdur, amma “adi” fayl və ya direktoriya olmayan “qeyri‑adi” yazılarla rastlaşsanız — ola bilsin, bunlar symlinklərdir. Onlara geniş mövzularda qayıdacağıq.
6. Direktoriyalarla işləyərkən tipik səhvlər
Səhv №1: boş olmayan direktoriyanı sadə Files.delete(path) çağırışı ilə silməyə cəhd. Java DirectoryNotEmptyException atacaq. Əvvəlcə məzmunu silin, sonra qovluğun özünü.
Səhv №2: Files.list()-dən gələn axını bağlamağı unutmaq. Əgər try‑with‑resources istifadə etməsəniz, axın açıq qalacaq və Windows-da qovluğu silərkən xəta yarana bilər.
Səhv №3: valideynin mövcudluğunu yoxlamadan direktoriya yaratmaq. Files.createDirectory çağırışını parent/child tipli yolda icra etdikdə, əgər parent mövcud deyilsə, NoSuchFileException alacaqsınız. Files.createDirectories istifadə edin.
Səhv №4: zərurət olmadan mütləq (absolute) yollardan istifadə. Layihə daxilində nisbî (relative) yollara üstünlük verin — belə kod daha daşınandır.
Səhv №5: IOException işlənmir. Fayl sistemi ilə istənilən əməliyyat xətayla bitə bilər. try-catch ilə əhatə edin və ya istisnanı yuxarıya ötürün.
Səhv №6: hüququnuz olmayan qovluqda yaratmağa/silməyə cəhd. Bu halda AccessDeniedException alacaqsınız. İcra kontekstini və giriş icazələrini yoxlayın.
GO TO FULL VERSION