CodeGym /Kurslar /JAVA 25 SELF /Faylların yenidən kodlaşdırılması: bir kodlaşdırmada oxu,...

Faylların yenidən kodlaşdırılması: bir kodlaşdırmada oxu, digərində yazı

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

1. Giriş

Təsəvvür edin, mühasib sizə hesabat faylı göndərib və o, "Windows-1251" (kiril əlifbası üçün köhnə kodlaşdırma) ilə saxlanıb. Sizin Java tətbiqiniz isə bütün girişləri "UTF-8" gözləyir, əks halda “şikayət edir” və hərflər əvəzinə iyerogliflər göstərir. Məsələn, yalnız "ISO-8859-1" qəbul edən bir sistemlə inteqrasiya edirsiniz. Nə etməli? Əlbəttə, faylı yenidən kodlaşdırmaq!

Yenidən kodlaşdırma — mətnin fayldan bir kodlaşdırmada oxunub başqa kodlaşdırmada saxlanılması prosesidir. Bu, sanki məktubu bir dildən digərinə köçürmək kimidir ki, alıcı mesajınızı tam başa düşsün.

Java-da yenidən kodlaşdırma necə işləyir: ümumi yanaşma

Java-da sətirlər (String) proqram daxilində həmişə Unicode-da (UTF‑16) saxlanılır. Bu o deməkdir ki, siz mətni fayldan oxuyan kimi o artıq “universal” olur və istənilən dəstəklənən kodlaşdırmada yazıla bilər. Buna görə də yenidən kodlaşdırma sadəcə belədir:

  • Faylı düzgün ilkin kodlaşdırmanı göstərərək sətirlər kimi oxuyun.
  • Bu sətirləri lazımi hədəf kodlaşdırmanı açıq göstərərək yeni fayla yazın.

Sxem:

[A kodlaşdırmasında fayl] --(Charset A ilə oxu)--> [Yaddaşda String] --(Charset B ilə yazı)--> [B kodlaşdırmasında fayl]

2. Yenidən kodlaşdırmanın addım-addım alqoritmi

Addım 1. İlkin və hədəf kodlaşdırmanı müəyyən edin
İlkin kodlaşdırma — ilkin faylın saxlandığı kodlaşdırmadır (məsələn, "Windows-1251"). Hədəf kodlaşdırma — nəticəni almaq istədiyiniz kodlaşdırmadır (məsələn, "UTF-8").

Addım 2. Lazımi kodlaşdırma ilə oxuma axınını açın
Files.newBufferedReader(Path, Charset) və ya klassik InputStreamReader-dan istifadə edin.

Addım 3. Lazımi kodlaşdırma ilə yazma axınını açın
Files.newBufferedWriter(Path, Charset) və ya klassik OutputStreamWriter-dan istifadə edin.

Addım 4. Sətirləri oxuyun və yeni fayla yazın
Sətir-sətir (və ya fayl kiçikdirsə, tam) oxuyun, hər sətiri yeni fayla yazın.

Addım 5. Axınları bağlayın (ən yaxşısı try-with-resources istifadə etməkdir)
Beləliklə resursların düzgün azad edilməsini təmin edirsiniz. try-with-resources konstruksiyasından istifadə edin.

3. Kod nümunəsi: Windows-1251 → UTF-8 yenidən kodlaşdırması

Gəlin Windows‑1251-dən UTF‑8-ə faylı yenidən kodlaşdıran sadə bir proqram həyata keçirək. Belə nümunə real həyatda tez-tez rast gəlinir, xüsusən rusdilli məlumatlarla işləyirsinizsə.

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

public class FileReencoder {
    public static void main(String[] args) throws IOException {
        // Fayl yolları
        Path inputPath = Paths.get("input-1251.txt");
        Path outputPath = Paths.get("output-utf8.txt");

        // Windows-1251 ilkin kodlaşdırması ilə reader açırıq
        try (
            BufferedReader reader = Files.newBufferedReader(inputPath, Charset.forName("Windows-1251"));
            BufferedWriter writer = Files.newBufferedWriter(outputPath, StandardCharsets.UTF_8)
        ) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // sətirsonunu unutmayaq!
            }
        }

        System.out.println("Fayl Windows-1251-dən UTF-8-ə uğurla yenidən kodlaşdırıldı!");
    }
}

Burada biz oxu üçün kodlaşdırmanı açıq şəkildə göstəririk (Charset.forName("Windows-1251")) və yazı üçün (StandardCharsets.UTF_8). Sonra isə try-with-resources-dən istifadə edirik ki, səhv baş versə belə axınlar avtomatik bağlansın. writer.newLine() — faylın strukturu qorunsun deyə sətirsonu əlavə edir.

4. Vacib nüanslar və faydalı məsləhətlər

Faylın ilkin kodlaşdırmasını necə müəyyən etmək olar?

  • Faylın özündə kodlaşdırmanı göstərən “etiket” olmur (istisna — BOM, amma o da həmişə rast gəlinmir).
  • Faylı siz yaratmısınızsa — yazarkən istifadə etdiyiniz eyni kodlaşdırmadan istifadə edin.
  • Fayl “haradansa” gəlibsə — kodlaşdırmanı göstərən redaktorda açmağı sınayın (məsələn, Notepad++, Visual Studio Code).
  • Linux-da file -i fayl_adi əmri istifadə oluna bilər, amma o, kodlaşdırmanı həmişə düzgün müəyyən etmir.

Yanlış ilkin kodlaşdırmanı göstərsəniz nə baş verəcək?

“Qarışıq, anlaşılmaz simvollar” və ya simvolların itməsi ilə qarşılaşacaqsınız. Məsələn, Windows‑1251-də saxlanmış faylı UTF‑8 kimi oxusanız, kiril mətni "Привет" kimi görünəcək.

İstisnaların işlənməsi

Fayllarla işləyərkən həmişə səhvlər mümkündür: fayl tapılmadı, icazə yoxdur, kodlaşdırma yanlışdır. İstisnaları idarə edin (try-catch) və ya onları yuxarı ötürün (throws) ki, tətbiq “izahsız” dayanmasın.

Böyük fayllarla iş

Əgər fayl çox böyükdürsə (qiqabaytlarla!), göstərilən nümunələrdəki kimi sətir-sətir oxuma və yazmadan istifadə edin. Bütün faylı yaddaşa tam oxumayın — əks halda OutOfMemoryError ala bilərsiniz.

“On-the-fly” yenidən kodlaşdırma (streaming)

Fayl çox böyükdürsə, hətta aralıq fayl da yaratmaya bilərsiniz — məsələn, şəbəkədən gələn məlumatların axınla emalı zamanı “on-the-fly” oxuyub-yaza bilərsiniz.

5. Faylların yenidən kodlaşdırılmasında tipik səhvlər

Səhv №1: Yanlış ilkin kodlaşdırma. İlkin kodlaşdırmanı səhv seçsəniz, nəticə məyusedici olacaq: “Privet” "Привет"-ə çevriləcək. Həmişə faylın hansı kodlaşdırmada yaradıldığını dəqiqləşdirin.

Səhv №2: Sistemin standart kodlaşdırmasından qeyri-aşkar istifadə. Kodlaşdırmanı açıq göstərməsəniz, Java sistemin susmaya görə dəyərini istifadə edir (System.getProperty("file.encoding")). Bu, müxtəlif kompüterlərdə fərqli nəticələrə səbəb ola bilər (məsələn, Windows-da — cp1251, Linux-da — UTF‑8).

Səhv №3: Bütün faylı yaddaşa oxuma və yazma. Böyük fayllar üçün bu yanaşma yaddaşın dolmasına gətirib çıxaracaq. Sətir-sətir oxu və yazmadan istifadə edin.

Səhv №4: Emal olunmamış istisnalar. Fayllar mövcud olmaya, başqa proseslər tərəfindən məşğul ola və ya səhv simvollar ehtiva edə bilər. Həmişə istisnaları emal edin və ya try-with-resources-dən istifadə edin.

Səhv №5: İkili (binary) faylların yenidən kodlaşdırılması. Şəkilləri, PDF-ləri, arxivləri və digər ikili faylları yenidən kodlaşdırmağa çalışmayın! Bu, onların korlanmasına səbəb olacaq. Yenidən kodlaşdırma yalnız mətn faylları üçün məntiqlidir.

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