1. Faylların kopyalanması
Metod Files.copy: əsas sintaksis
Java-da fayl və qovluqları kopyalamaq üçün Files.copy adlı statik metoddan (paket: java.nio.file) istifadə olunur. Biz artıq onunla rastlaşmışıq, indi isə daha ətraflı öyrənəcəyik. Files.copy üçün əsas sintaksis:
Files.copy(Path source, Path target, CopyOption... options)
- source — mənbə fayla və ya qovluğa yol.
- target — kopyalanacaq yerin yolu.
- options — əlavə seçimlər (məsələn, üzərinə yazmağa icazə).
Ən sadə nümunə
Gəlin "input.txt" faylını cari qovluqdan "backup" qovluğuna "input_backup.txt" adı ilə kopyalayaq:
import java.nio.file.*;
public class CopyExample {
public static void main(String[] args) throws Exception {
Path source = Path.of("input.txt");
Path target = Path.of("backup/input_backup.txt");
Files.copy(source, target);
System.out.println("Fayl kopyalandı!");
}
}
Vacib məqamlar:
- Əgər təyinat faylı artıq mövcuddursa, FileAlreadyExistsException istisnası atılacaq.
- Əgər "backup" qovluğu mövcud deyilsə, metod xəta atacaq — qovluq əvvəlcədən yaradılmalıdır!
Üzərinə yazmaqla kopyalama
Faylın üzərinə yazmağa icazə vermək üçün StandardCopyOption.REPLACE_EXISTING seçimindən istifadə edin:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
Cədvəl: kopyalama üçün əsas seçimlər
| Seçim | Təsvir |
|---|---|
|
Fayl artıq mövcuddursa, üzərinə yazır |
|
Atributları kopyalayır (yaradılma tarixi və s.) |
|
Atomik köçürmə (yalnız move ilə istifadə olunur) |
Faylın başqa qovluğa kopyalanması
Kopyalamadan əvvəl təyinat qovluğunun mövcud olduğundan əmin olun:
Path targetDir = Path.of("backup");
if (!Files.exists(targetDir)) {
Files.createDirectory(targetDir);
}
Files.copy(source, targetDir.resolve("input_backup.txt"), StandardCopyOption.REPLACE_EXISTING);
Qovluqların kopyalanması: incə məqam
Metod Files.copy qovluqları yalnız “boş qabıq” kimi kopyalaya bilir — məzmun (fayllar və alt qovluqlar) kopyalanmır! Əgər faylları olan qovluğu kopyalamağa çalışsanız, yalnız boş qovluq əldə edəcəksiniz. Bütöv qovluqları məzmunu ilə kopyalamaq üçün rekursiv keçid və hər faylın ayrıca kopyalanması tələb olunur (buna növbəti mühazirələrdə qayıdacağıq).
Nümunə: faylı bir qovluqdan digərinə kopyalayırıq
Path source = Path.of("data/report.txt");
Path target = Path.of("backup/report.txt");
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
Kopyalama zamanı xətaların emalı
Kopyalama müxtəlif səbəblərdən uğursuz ola bilər: giriş icazəsi yoxdur, fayl məşğuldur, yaddaş çatmır, fayl artıq mövcuddur və s. Həmişə try-catch istifadə etmək daha yaxşıdır:
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Kopyalama uğurla başa çatdı!");
} catch (FileAlreadyExistsException e) {
System.out.println("Fayl artıq mövcuddur: " + target);
} catch (IOException e) {
System.out.println("Giriş-çıxış xətası: " + e.getMessage());
}
2. Fayl və qovluqların köçürülməsi
Metod Files.move: sintaksis
Fayl və qovluqların köçürülməsi aşağıdakı metodla həyata keçirilir:
Files.move(Path source, Path target, CopyOption... options)
Burada source — fayla yol (haradan daşıyırıq), target — faylı və ya qovluğu hara yerləşdirmək istədiyimiz yol, options — əlavə tənzimləmələr (məsələn, mövcud faylın əvəzlənməsi).
Yeri gəlmişkən, köçürmə təkcə faylın “yerinin dəyişdirilməsi” deyil, həm də adını dəyişdirmə üsuludur (yalnız ad dəyişirsə). Əgər təyinat qovluğunda həmin adla fayl artıq varsa, REPLACE_EXISTING seçimi göstərilməsə, istisna atılacaq.
Nümunə: faylın başqa qovluğa köçürülməsi
Path source = Path.of("data/report.txt");
Path target = Path.of("archive/report.txt");
Files.move(source, target);
System.out.println("Fayl köçürüldü!");
Mövcud faylın əvəzlənməsi ilə köçürmə
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
Qovluğun köçürülməsi
Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("archive/old_reports");
Files.move(oldDir, newDir);
Bütün qovluq, daxilindəki fayl və alt qovluqlar da daxil olmaqla, yeni yerə köçürüləcək.
Lakin təyinat yerində eyni adlı qovluq artıq varsa — xəta alacaqsınız.
Müxtəlif fayl sistemləri arasında köçürmə
Əgər faylı müxtəlif disklər arasında köçürürsünüzsə (məsələn, "C:"-dən "D:"-yə), daxildə əvvəlcə kopyalama, sonra isə mənbə faylın silinməsi baş verəcək. Əməliyyat atomik kimi dəstəklənmirsə, AtomicMoveNotSupportedException istisnası atıla bilər.
move ilə copy arasındakı fərq
- copy — ilkin fayl/qovluq yerində qalır, surəti yaranır.
- move — ilkin fayl/qovluq silinir, yalnız yeni nüsxə qalır.
3. Fayl və qovluqların adının dəyişdirilməsi
Java-da ayrıca “faylın adını dəyişdirmək” metodu yoxdur. Adın dəyişdirilməsi köçürmənin xüsusi halıdır: eyni qovluqda yeni adla yeni yol göstərirsiniz.
Nümunə: faylın adını dəyişdirmək
Güman edək ki, bizdə "report.txt" faylı var və onu eyni qovluqda "report_old.txt" adına dəyişmək istəyirik:
Path dir = Path.of("data");
Path oldName = dir.resolve("report.txt");
Path newName = dir.resolve("report_old.txt");
Files.move(oldName, newName);
System.out.println("Faylın adı dəyişdirildi!");
Vacib nüanslar
Əgər təyinat qovluğunda göstərdiyiniz adla fayl və ya qovluq artıq mövcuddursa, metod istisna atacaq. Bu məhdudiyyəti aşmaq və əvəzləməyə icazə vermək üçün StandardCopyOption.REPLACE_EXISTING seçimindən istifadə edə bilərsiniz.
Nümunə:
Path source = Paths.get("old_name.txt");
Path target = Paths.get("new_name.txt");
// Faylın adını dəyişdirək, əgər artıq varsa — əvəz edək
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
Bu nümunədə "old_name.txt" faylının adı "new_name.txt" olaraq dəyişdiriləcək. Əgər qovluqda həmin adlı fayl artıq mövcud idisə, onun üzərinə yazılacaq.
Qovluğun adının dəyişdirilməsi
Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("data/archived_reports");
Files.move(oldDir, newDir);
System.out.println("Qovluğun adı dəyişdirildi!");
4. Kopyalama, köçürmə və adın dəyişdirilməsi zamanı xətaların emalı
Fayl sistemi ilə iş həmişə gözlənilməz halların riskini daşıyır. Ən çox rast gəlinən problemlər:
Fayl artıq mövcuddur.
İstisna: FileAlreadyExistsException. Həll: əvəz etmək istəyirsinizsə, REPLACE_EXISTING istifadə edin.
Fayl və ya qovluq başqa proses tərəfindən istifadə olunur.
İstisna: IOException. Məsələn, fayl başqa proqramda açıqdır.
Fayl və ya qovluğa giriş yoxdur.
İstisna: AccessDeniedException. İstifadəçi icazələri ilə problem.
Müxtəlif fayl sistemləri arasında köçürmə.
İstisna: AtomicMoveNotSupportedException. Bütün fayl sistemləri atomik köçürməni dəstəkləmir.
Təyinat qovluğu mövcud deyil.
Kopyalama/Köçürmə üçün təyinat qovluğunun əvvəlcədən yaradıldığına əmin olun!
Xətaların emalı nümunəsi
try {
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
System.out.println("Təyinat faylı artıq mövcuddur: " + target);
} catch (AtomicMoveNotSupportedException e) {
System.out.println("Atomik köçürmə dəstəklənmir: " + e.getMessage());
} catch (IOException e) {
System.out.println("Köçürmə zamanı xəta: " + e.getMessage());
}
5. Praktik tövsiyələr
Təyinat faylının/qovluğunun mövcudluğunu yoxlamaq
Kopyalamadan və ya köçürmədən əvvəl təyinat yolunun məşğul olub-olmadığını yoxlamaq faydalıdır:
if (Files.exists(target)) {
System.out.println("Fayl artıq var, üzərinə yazmayaq.");
} else {
Files.copy(source, target);
}
Təhlükəsiz əməliyyatlar üçün müvəqqəti fayllardan istifadə
Mürəkkəb əməliyyatlarda (məsələn, vacib faylların yenilənməsi) tez-tez müvəqqəti fayllardan istifadə edilir — əvvəlcə müvəqqəti fayla kopyalanır, sonra əsas fayl əvəz olunur:
Path temp = Path.of("data/report.tmp");
Files.copy(source, temp, StandardCopyOption.REPLACE_EXISTING);
Files.move(temp, target, StandardCopyOption.REPLACE_EXISTING);
Bu yanaşma nasazlıqlar zamanı məlumat itkisi riskini minimuma endirir.
Nümunə: əvəzləmədən əvvəl faylın ehtiyat nüsxəsini yaratmaq
Path file = Path.of("data/report.txt");
Path backup = Path.of("data/report_backup.txt");
if (Files.exists(file)) {
Files.copy(file, backup, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Ehtiyat nüsxə yaradıldı.");
}
6. Cədvəl: əsas metodlar və seçimlər
| Əməliyyat | Java NIO metodu | Xüsusiyyətlər |
|---|---|---|
| Kopyalama | |
Qovluqların məzmununu kopyalamır! |
| Köçürmə | |
Adın dəyişdirilməsi üçün istifadə oluna bilər |
| Adın dəyişdirilməsi | |
Eyni qovluqda yeni yol |
| Üzərinə yazma | |
Təyinat faylının/qovluğunun üzərinə yazır |
| Yoxlama | |
Faylın/qovluğun mövcudluğunu yoxlayır |
7. Faylları kopyalama, köçürmə və adını dəyişdirmə zamanı tipik səhvlər
Səhv №1: faylı mövcud olmayan qovluğa kopyalamağa cəhd. Əgər təyinat qovluğu yaradılmayıbsa, NoSuchFileException alacaqsınız. Həll: qovluğu əvvəlcədən Files.createDirectories ilə yaradın.
Səhv №2: qovluğu tam şəkildə Files.copy ilə kopyalamağa cəhd. Metod yalnız “boş qabıq” kopyalayır, məzmunu yox. Tam kopyalama üçün rekursiv keçid lazımdır.
Səhv №3: mövcud fayl halının emal edilməməsi. REPLACE_EXISTING ötürməsəniz və fayl artıq mövcuddursa, istisna atılacaq. Bu halı açıq şəkildə emal etmək daha yaxşıdır.
Səhv №4: yeni adla fayl artıq mövcud ikən faylın adını dəyişdirmək cəhdi. Eyni şəkildə, FileAlreadyExistsException alacaqsınız. Adını dəyişdirməzdən əvvəl faylın mövcudluğunu yoxlamaq olar.
Səhv №5: müxtəlif fayl sistemləri arasında köçürmə. Bəzən əməliyyat “atomik” dəstəklənmir və AtomicMoveNotSupportedException atılır. Bu halda atomik olmadan adi köçürmədən istifadə edin.
Səhv №6: giriş hüquqlarının olmaması və ya faylın bloklanması. Əgər fayl başqa proqramda açıqdırsa və ya yazma/oxuma hüququ yoxdur, AccessDeniedException və ya IOException alacaqsınız. Həmişə belə istisnaları emal edin.
GO TO FULL VERSION