CodeGym /Kurslar /JAVA 25 SELF /Faylların oxunması və yazılması: əsas əməliyyatlar

Faylların oxunması və yazılması: əsas əməliyyatlar

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

1. Faylın bütövlükdə oxunması

Bütün baytların oxunması

Bəzən bir fayldan bütün məzmunu birdəfəlik — olduğu kimi, heç nəyi ayırmadan çıxarmaq lazımdır; istər şəkil, arxiv, istərsə də hər hansı binar format olsun. Bunun üçün Java-da Files.readAllBytes(path) metodu var. O, bayt massivi (byte[]) qaytarır, yəni faylın xam məlumatlarını; siz onları istədiyiniz kimi istifadə edə bilərsiniz.

import java.nio.file.*;

public class ReadBytesExample {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("example.txt");
        byte[] allBytes = Files.readAllBytes(path);
        System.out.println("Faylın bayt sayı: " + allBytes.length);
    }
}

Qeyd: Əgər fayl böyükdürsə (giqabaytlarla), bu yanaşma yaddaş problemlərinə səbəb ola bilər — çünki faylın bütün məzmunu dərhal operativ yaddaşa yüklənir.

Bütün sətirlərin oxunması

Mətn faylları üçün daha rahat üsul var: Files.readAllLines(path). O, sətirlərin siyahısını (List<String>) qaytarır; burada hər sətir fayldakı bir sətrə uyğundur (sətir ayırıcıları avtomatik nəzərə alınır).

import java.nio.file.*;
import java.util.List;

public class ReadLinesExample {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("example.txt");
        List<String> lines = Files.readAllLines(path);

        for (String line : lines) {
            System.out.println(line);
        }
    }
}

Vacibdir: Susma rejimində sistem kodlaşdırmasından istifadə olunur. Əgər kodlaşdırmanı açıq göstərmək istəyirsinizsə (məsələn, UTF-8), metodun aşırı yüklənmiş versiyasından istifadə edin:

List<String> lines = Files.readAllLines(path, java.nio.charset.StandardCharsets.UTF_8);

Nümunə: faylı oxuyub ekrana çıxarmaq

Gəlin bunu mini-tətbiqimizə əlavə edək (məsələn, “bloknot” və ya “tapşırıqlar siyahısı”):

import java.nio.file.*;
import java.util.List;

public class TodoReader {
    public static void main(String[] args) throws Exception {
        Path todoPath = Paths.get("todo.txt");
        if (Files.exists(todoPath)) {
            List<String> tasks = Files.readAllLines(todoPath);
            System.out.println("Bu gün üçün tapşırıqlarınız:");
            for (String task : tasks) {
                System.out.println("- " + task);
            }
        } else {
            System.out.println("todo.txt faylı tapılmadı. Tapşırıqlar siyahısı yaradın!");
        }
    }
}

2. Fayla yazma

Bayt massivinin yazılması

Əgər bayt massivi (məsələn, seriyalaşdırmanın nəticəsi, şəkil, audio) varsa, Files.write(path, bytes) istifadə edin. Bu metod fayl yoxdursa onu yaradır, varsa mövcud faylın üzərinə yazır.

import java.nio.file.*;

public class WriteBytesExample {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("output.bin");
        byte[] data = {1, 2, 3, 4, 5};
        Files.write(path, data);
        System.out.println("Baytlar output.bin faylına yazıldı");
    }
}

Sətirlər siyahısının yazılması

Mətn faylları üçün sətirlər siyahısından istifadə etmək daha rahatdır — hər sətir ayrıca, sətirsonu ilə yazılacaq.

import java.nio.file.*;
import java.util.Arrays;
import java.util.List;

public class WriteLinesExample {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("todo.txt");
        List<String> tasks = Arrays.asList(
            "Süd almaq",
            "Nənəyə zəng etmək",
            "Java üzrə ev tapşırığını etmək"
        );
        Files.write(path, tasks);
        System.out.println("Tapşırıqlar siyahısı todo.txt faylına yazıldı");
    }
}

Diqqət: Susma rejimində faylın üzərinə yazılacaq! Əgər o artıq mövcuddursa, köhnə tapşırıqlar yox olacaq. (Köhnəni necə itirməmək barədə az sonra danışacağıq.)

Sətirin fayla yazılması

Əgər tək bir sətir yazmaq istəyirsinizsə — bir elementli siyahı yaradın və ya Files.write(path, string.getBytes()) istifadə edin:

import java.nio.file.*;

public class WriteStringExample {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("hello.txt");
        String message = "Salam, Java!";
        Files.write(path, message.getBytes());
        System.out.println("Sətir hello.txt faylına yazıldı");
    }
}

Kodlaşdırmanı açıq göstərmək

Rusca (və yalnız o deyil) mətnlə işləyərkən “qarışıq simvollar”dan qaçmaq üçün kodlaşdırmanı həmişə açıq şəkildə göstərin:

import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.List;

public class WriteLinesUtf8Example {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("hello.txt");
        List<String> lines = List.of("Salam, dünya!", "Bu Java-dır.");
        Files.write(path, lines, StandardCharsets.UTF_8);
    }
}

3. Xətaların işlənməsi

Fayllarla işləyərkən Java IOException istisnasını ata bilər. Bu, giriş-çıxış səviyyəsində “nəyinsə qaydasında getmədiyi” barədə ümumi siqnaldır. Səbəblər çox ola bilər: fayl sadəcə mövcud deyil, giriş icazələri kifayət etmir, disk doludur və ya məşğuldur, hətta bəzən ən uyğunsuz anda flaş kartı çıxarıla bilər.

Buna görə də faylları oxuma və yazma metodları belə situasiyaları işləməyə hazır olmağımızı tələb edir. Bu, try-catch vasitəsilə edilir:

import java.nio.file.*;
import java.util.List;
import java.io.IOException;

public class SafeReadExample {
    public static void main(String[] args) {
        Path path = Paths.get("todo.txt");
        try {
            List<String> lines = Files.readAllLines(path);
            System.out.println("Faylın məzmunu:");
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (IOException ex) {
            System.out.println("Faylı oxuyarkən xəta: " + ex.getMessage());
        }
    }
}

Bunun hamısı nə üçündür?

try-catch potensial proqram çöküşünü idarə olunan vəziyyətə çevirir. Fayl yoxdursa — istifadəçiyə sakitcə bildirəcəyik. Sistem girişə icazə vermirsə — problemi göstərəcəyik. Disk əməliyyatın ortasında yoxa çıxsa, proqram dəhşətli stack trace ilə çöküb getməyəcək, ən azı normal bir mesajla xəbərdarlıq edəcək. Başqa sözlə: IOException düşmən deyil, sadəcə Java-nın bizə demə üsuludur: “ey, burada çöldə nəsə qaydasında getmədi, davamı üçün qərar ver”.

4. Praktik nümunələr

Faylı oxumaq və məzmununu çıxarmaq

import java.nio.file.*;
import java.util.List;
import java.io.IOException;

public class PrintFileExample {
    public static void main(String[] args) {
        Path path = Paths.get("notes.txt");
        try {
            if (!Files.exists(path)) {
                System.out.println("notes.txt faylı tapılmadı.");
                return;
            }
            List<String> lines = Files.readAllLines(path, java.nio.charset.StandardCharsets.UTF_8);
            System.out.println("notes.txt faylının məzmunu:");
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("Faylı oxuyarkən xəta: " + e.getMessage());
        }
    }
}

Yeni fayla sətir yazmaq

import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.io.IOException;

public class WriteFileExample {
    public static void main(String[] args) {
        Path path = Paths.get("greeting.txt");
        String content = "Java IO dünyasına xoş gəlmisiniz!";
        try {
            Files.write(path, content.getBytes(StandardCharsets.UTF_8));
            System.out.println("Sətir greeting.txt faylına yazıldı");
        } catch (IOException e) {
            System.out.println("Faylı yazarkən xəta: " + e.getMessage());
        }
    }
}

Fayla sətirlər siyahısı yazmaq

import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.io.IOException;

public class WriteListExample {
    public static void main(String[] args) {
        Path path = Paths.get("shopping.txt");
        List<String> items = List.of("Çörək", "Süd", "Pendir");
        try {
            Files.write(path, items, StandardCharsets.UTF_8);
            System.out.println("Alış-veriş siyahısı shopping.txt faylına yazıldı");
        } catch (IOException e) {
            System.out.println("Faylı yazarkən xəta: " + e.getMessage());
        }
    }
}

5. Axınlar (streams) haqqında qısa

Files.readAllBytes, Files.readAllLines, Files.write metodları “hamısı bir anda” yanaşmasıdır: ya bütün fayl yaddaşa, ya da bütün məzmun dərhal diskə yazılır. Kiçik fayllar üçün bu əlverişlidir, böyük fayllar üçün isə yox ( OutOfMemoryError ala və ya giqabaytlıq loqları oxuyarkən sadəcə “donub” qala bilərsiniz).

Böyük fayllarla işləmək və ya sətir-sətir oxumaq üçün axınlardan istifadə olunur:

  • Mətn üçün: BufferedReader, BufferedWriter
  • Baytlar üçün: InputStream, OutputStream

Axınlar barədə ətraflı növbəti mühazirələrdə danışacağıq, amma kiçik bir “tizer”:

import java.nio.file.*;
import java.io.*;

public class BufferedReaderExample {
    public static void main(String[] args) {
        Path path = Paths.get("bigfile.txt");
        try (BufferedReader reader = Files.newBufferedReader(path)) {
            String line;
            while ((line = reader.readLine()) != null) {
                // Sətiri emal edirik
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("Faylı oxuyarkən xəta: " + e.getMessage());
        }
    }
}

6. Faydalı nüanslar

  • Faylın üzərinə yazmaq: Files.write metodları susma rejimində faylın üzərinə yazır. Sonuna əlavə etmək lazımdırsa, əlavə seçimlərdən istifadə edin (bu barədə — növbəti mühazirədə).
  • Kodlaşdırma: ASCII-dən kənar mətnlə işləyirsinizsə, kodlaşdırmanı həmişə açıq göstərin. Bu, çıxışda “qarışıq simvollar”ın qarşısını alacaq. Yaxşı seçim — StandardCharsets.UTF_8.
  • Yollar: Kross-platforma üçün Paths.get(...) istifadə edin. Slash-ları (/ və ya \) heç vaxt əl ilə hardkod etməyin.
  • Fayl adları: Fayl adında qadağan olunmuş simvollardan (?, *, :, <, >, | və s.) istifadə etməyin, xüsusilə də kodunuz Windows-da işləməlidirsə.

7. Faylları oxuma və yazmada tipik səhvlər

Səhv №1: IOException işlənmir. Çox vaxt yeni başlayanlar Files.readAllLines(path) metodunu try-catch olmadan yazırlar və ilk problem zamanı (fayl tapılmadı, icazə yoxdur, disk zədələnib) proqram çökür. Həmişə istisnaları işləyin!

Səhv №2: Böyük fayllarla readAllBytes/readAllLines vasitəsilə işləmək. Əgər fayl yüzlərlə meqabayt və ya giqabaytlardırsa, onu tam yükləmək cəhdi proqramınızı “öldürə” bilər. Belə hallarda axınlardan (BufferedReader) istifadə edin.

Səhv №3: Mətnin yazılması/oxunması zamanı kodlaşdırma göstərilmir. Kodlaşdırmanı göstərməsəniz, müxtəlif kompyuterlər və OS-lərdə nəticə fərqli ola bilər. Xüsusilə kiril əlifbası ilə işləyərkən problem tez-tez üzə çıxır. StandardCharsets.UTF_8 və ya sizə lazım olan kodlaşdırmanı açıq göstərin.

Səhv №4: File/Path — elə faylın özüdür deyə düşünmək. File və ya Path sinfi faylın özü deyil, sadəcə fayla “istiqamət verən bir etiketdir”. Obyekt yaratmaqla diskin üzərində fayl yaratmırsınız. Fayl yaratmaq üçün Files.createFile, Files.write və sair metodlardan istifadə edin.

Səhv №5: Axın bağlanmır (əgər axınlardan istifadə edirsinizsə). Əgər axınları əl ilə istifadə edirsinizsə (məsələn, BufferedReader), onları mütləq bağlayın (ən yaxşısı try-with-resources vasitəsilə). Əks halda fayl “kilidlənmiş” vəziyyətdə qala və digər proqramlar üçün əlçatmaz ola bilər.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION