CodeGym /Kurslar /JAVA 25 SELF /Fayllarla iş üzrə ən yaxşı təcrübələr

Fayllarla iş üzrə ən yaxşı təcrübələr

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. Xətaların emalı: istisnaları gözardı etməyin!

Fayllarla iş — həmişə xarici dünya ilə qarşılıqlı əlaqədir və bu, çox gözlənilməz ola bilər. Disklər dolub-daşa bilər, fayllar — yoxa çıxa bilər, icazələr — dəyişə bilər, istifadəçilər isə — ağlagəlməz hərəkətlər edə bilərlər (məsələn, proqramınızı adı boşluq olan qovluqdan və ya az sonra çıxarılacaq fleşdən işə salmaq). Kodunuz buna hazır deyilsə, o, təkcə “çökmək” riski daşımır, həm də istifadəçini lazım olan məlumatlardan məhrum edə bilər.

Best practices — təkcə “dəbli məsləhətlər” deyil, zamanla sınaqdan keçmiş fəndlər toplusudur; onlar ən xoşagəlməz ssenarilərin qarşısını almağa kömək edir: məlumat itkiləri, resurs sızmaları, məxfi məlumatların açıqlanması və sonradan həmkarların (xüsusilə də — istifadəçilərin) üzünə baxmağa utandıran axmaq buglar.

Niyə boş catch yazmaq olmaz?

Java-da (və yalnız orada deyil) belə bir şey yazmaq çox cazibədardır:

try {
    // fayl ilə iş
} catch (IOException e) {
    // alınmadı — eybi yox!
}

Bu — edilə biləcək ən pis şeydir. Belə kod xətanı sadəcə “udmur”: onu həm istifadəçi, həm də sizin üçün görünməz edir. Nəticədə, nəsə qaydasında getmədikdə, nə məhz nə vaxt baş verdiyini heç vaxt bilməyəcəksiniz.

Düzgün necə?

  • Xətaları jurnala yazın: ən azı konsola mesaj çıxarın və ya log-fayla yazın.
  • İstifadəçiyə bildirin: xəta kritikdirsə, mehriban bir mesaj göstərin.
  • Artıq məlumat açıqlamayın: istifadəçiyə sistemin daxili detallarını göstərməyin (məsələn, tam stack trace — bu daha çox inkişaf etdirici üçündür).

Nümunə:

try {
    List<String> lines = Files.readAllLines(Path.of("data.txt"));
    // məlumatların emalı
} catch (IOException e) {
    System.err.println("Faylın oxunması zamanı xəta: " + e.getMessage());
    // Təfərrüatları log-fayla yazmaq olar
    e.printStackTrace(System.err);
}

Niyə konkret istisnaları tutmaq vacibdir?
Çünki müxtəlif xətalar fərqli reaksiya tələb edir. Məsələn, fayl tapılmadıqda — istifadəçiyə başqa fayl seçməyi təklif etmək olar (NoSuchFileException və ya FileNotFoundException). Əgər icazə yoxdursa — proqramı lazımi hüquqlarla işə salmağı xahiş edin (AccessDeniedException). Disk doludursa — yer boşaltmağı təklif edin (yazma zamanı IOException).

2. Giriş icazələri və təhlükəsizlik

Əməliyyatlardan əvvəl icazələri yoxlayın

Faylı oxumadan və ya yazmadan əvvəl bunun üçün hüquqlarınızın olduğuna əmin olmaq faydalıdır. Java-da belə metodlar var:

  • File.canRead()
  • File.canWrite()

Bu metodlar true qaytarsa belə, bu, uğuru zəmanət etmir — icazələr istənilən an dəyişə bilər (məsələn, başqa proses icazələri dəyişdi). Ona görə də həmişə istisnalara hazır olun.

Nümunə:

File file = new File("config.properties");
if (!file.canRead()) {
    System.err.println("Faylı oxumaq üçün hüquqlar yoxdur!");
    return;
}
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
    // faylın oxunması
} catch (IOException e) {
    System.err.println("Oxu zamanı xəta: " + e.getMessage());
}

Daxili detalların açıqlanmasından çəkinin

Proqramınız məxfi fayllarla (məsələn, parollarla) işləyirsə, bu faylların yollarını və ya məzmununu istifadəçiyə açıq olan xətalarda göstərməyin.

3. Kritik əməliyyatlar üçün nisbi yolları istifadə etməyin

Nisbi yol (new File("data.txt")) — proqramın necə işə salınmasından asılı olaraq dəyişə bilən cari işçi qovluğa nisbətən olan yoldur (məsələn, IDE-dən və ya komanda sətrindən). Bu, çaşqınlığa və xətalara səbəb ola bilər.

Ən yaxşı təcrübə: vacib fayllar üçün mütləq yollar istifadə edin və ya işçi qovluğu açıq şəkildə müəyyən edin.

Nümunə:

String userHome = System.getProperty("user.home");
Path configPath = Path.of(userHome, "myapp", "config.properties");

4. Müvəqqəti fayllar və qovluqlarla iş

Müvəqqəti fayllar nə üçün lazımdır?

Müvəqqəti fayllar müxtəlif tapşırıqlar üçün lazımdır. Bəzən onlar aralıq əməliyyatlar üçün istifadə olunur: məsələn, əvvəlcə məlumatlar müvəqqəti fayla yazılır, sonra bu fayl əsas faylı əvəz edir. Başqa bir variant — müvəqqəti fayllar proqram bitdikdən sonra lazım olmayan və təhlükəsiz silinə bilən məlumatları saxlamağa kömək edir.

Müvəqqəti faylları təhlükəsiz necə yaratmalı?

java.nio.file.Files kitabxanasındakı metodlardan istifadə edin:

Path tempFile = Files.createTempFile("myapp_", ".tmp");
// ... fayl ilə iş
Files.deleteIfExists(tempFile);

Müvəqqəti qovluqlar

Path tempDir = Files.createTempDirectory("myapp_");

5. Etibarlılıq: ehtiyat nüsxələr və bütövlüyə nəzarət

Vacib faylları dəyişərkən ehtiyat nüsxələrdən istifadə edin

Vacib faylı (məsələn, tənzimləmələri) yenidən yazmazdan əvvəl onun bir nüsxəsini çıxarın:

Path config = Path.of("config.properties");
Path backup = Path.of("config.properties.bak");
if (Files.exists(config)) {
    Files.copy(config, backup, StandardCopyOption.REPLACE_EXISTING);
}

Nəsə yazma zamanı qaydasında getməsə — həmişə ehtiyat nüsxədən bərpa etmək mümkündür.

Məlumatların bütövlüyünü yoxlayın

Xüsusilə vacib məlumatlar üçün nəzarət cəmlərindən (məsələn, MD5 və ya SHA-256) istifadə etmək olar. Faylı yazdıqdan sonra — checksum hesablayın və onu yanında saxlayın. Oxuyarkən — faylın dəyişib-dəyişmədiyini yoxlayın.

SHA-256 hesablanması nümunəsi (kriptografiya həvəskarları üçün):

import java.security.MessageDigest;
import java.nio.file.Files;
import java.nio.file.Path;

byte[] data = Files.readAllBytes(Path.of("important.dat"));
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(data);
// Hash-i ayrıca faylda saxlayın və ya oxuyarkən müqayisə edin

6. Yoxlama ilə fayldan istifadə arasındakı pəncərəni minimuma endirin

Bu — bizə artıq tanış olan klassik TOCTOU (Time Of Check To Time Of Use) problemidir: siz faylın mövcudluğunu yoxladığınız anla onu oxumağa başladığınız an arasında fayl yoxa çıxa və ya dəyişə bilər.

Ona görə də həmişə yoxlamanı və istifadəni bir try blokunda etməyə çalışın. Və faylı indicə yoxlamış olsanız belə, mütləq istisnaları emal edin.

Nümunə:

Path filePath = Path.of("data.txt");
if (Files.exists(filePath)) {
    try (BufferedReader reader = Files.newBufferedReader(filePath)) {
        // faylın oxunması
    } catch (IOException e) {
        System.err.println("Faylın oxunması zamanı xəta (ola bilsin, fayl yoxa çıxıb): " + e.getMessage());
    }
}

7. Bir neçə faydalı məsləhət də

Bütün resurslar üçün try-with-resources istifadə edin
AutoCloseable interfeysini reallaşdıran bütün siniflər (bu, demək olar ki, Java IO/NIO axınlarının hamısıdır) try-with-resources ilə istifadə oluna bilər. Bu, resurs sızmalarından qoruyur.

try (BufferedReader reader = Files.newBufferedReader(Path.of("data.txt"))) {
    // oxuma
}

Müvəqqəti faylları silməyi unutmayın

Files.deleteIfExists(tempFile);

Resursu iki dəfə bağlamayın
Əgər try-with-resources istifadə edirsinizsə, close() metodunu əl ilə çağırmayın — bu, xətalara və təkrarlanan bağlama cəhdlərinə səbəb ola bilər.

8. Fayllarla işləyərkən tipik səhvlər

Səhv №1: istisnaların görməzliyə vurulması.
Boş catch yazmaq — milçəyi əlinizlə tutub yenidən buraxmaq kimidir. Həmişə jurnala yazın və ya ən azı istifadəçiyə nəyin səhv getdiyini bildirin.

Səhv №2: axınları bağlamamaq.
Axını bağlamağı unutduqda, fayl kilidli qala bilər, sistem isə sərbəst deskriptorlarsız. try-with-resources istifadə edin.

Səhv №3: vacib fayllar üçün nisbi yolların istifadəsi.
İşçi qovluğun həmişə düşündüyünüz kimi olacağına arxayın olmayın. Yolu açıq şəkildə təyin etmək və ya xüsusi qovluqlardan istifadə etmək daha yaxşıdır (user.home, java.io.tmpdir).

Səhv №4: ehtiyat nüsxə olmadan vacib faylların üzərinə yazmaq.
Vacib bir şeyi silməzdən əvvəl backup edin. Bu, əsəblərinizi və istifadəçinin məlumatlarını xilas edəcək.

Səhv №5: giriş icazələrini yoxlamamaq.
İstifadəçinin lazım olan fayl və ya qovluqları oxumaq/yazmaq üçün hüquqları olduğuna əmin olun — əks halda gözlənilməz AccessDeniedException alacaqsınız.

Səhv №6: TOCTOU pəncərəsi.
Yoxlama ilə fayldan istifadə arasında faylı kimsə dəyişdirə və ya silə bilər. Yoxlamadan sonra belə, həmişə istisnaları emal edin.

Səhv №7: arxada müvəqqəti fayl və zibil qoymaq.
Proqramın qəza ilə tamamlanması və ya xətalardan sonra müvəqqəti fayllar qala bilər. Onları silməyi unutmayın, xüsusən də bu həssas məlumatlardırsa.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Fayllarla işləyərkən səhvlər
Fayllarla işləyərkən səhvlər
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION