1. Giriş
Gəlin düzünü deyək: əgər rus mətni əvəzinə Привет kimi bir şey görmüsünüzsə, siz artıq səhv kodlamanın qurbanısınız. Bu, fayl bir kodlamada yazılıb, başqa bir kodlamada oxunanda baş verir. Məsələn, fayl UTF-8 kimi saxlanıb, amma Windows-1251 kimi oxunur, yaxud əksinə.
Java standart olaraq sistem kodlamasından istifadə edir; onu belə öyrənmək olar:
System.out.println(System.getProperty("file.encoding"));
Bir kompüterdə bu UTF-8 ola bilər, digərində — Windows-1251, haradasa isə — ISO-8859-1. Məhz buna görə kodlamanı həmişə açıq şəkildə göstərmək daha yaxşıdır. Bu, xüsusilə çoxdilli məlumatlarla işləyirsinizsə, fayllar müxtəlif kompüterlərdə istifadə olunacaqsa və ya başqa proqramlarda açılacaqsa, yaxud kodunuzun yalnız öz maşınınızda deyil, istənilən mühitdə eyni davranmasını istəyirsinizsə, vacibdir.
Charset sinfi: kodlamalar dünyasında sizin dostunuz
Java-da kodlamalarla işləmək üçün java.nio.charset.Charset sinfi istifadə olunur. O, kodlamanı həm adla (məsələn, "UTF-8"), həm də standart konstantalarla (StandardCharsets.UTF_8) göstərməyə imkan verir.
Standart kodlamalara nümunələr:
| Kodlama | Java sabiti |
|---|---|
| UTF-8 | |
| UTF-16 | |
| ISO-8859-1 | |
| Windows-1251 | |
Konstantalardan istifadə üstün tutulur: adın yazılışında səhv etmə ehtimalı azalır və UnsupportedCharsetException yaranmaz.
2. Kodlamanı göstərərək faylları oxumaq
Köhnə üsul:
import java.io.*;
import java.nio.charset.StandardCharsets;
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("example.txt"),
StandardCharsets.UTF_8 // <-- Kodlamanı açıq şəkildə göstəririk
)
);
Müasir üsul:
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.io.BufferedReader;
BufferedReader reader = Files.newBufferedReader(
Paths.get("example.txt"),
StandardCharsets.UTF_8 // <-- Kodlamanı açıq şəkildə göstəririk
);
İkinci üsuldan istifadə tövsiyə olunur — o, daha qısadır, daha təhlükəsizdir və try-with-resources ilə rahat şəkildə uzlaşır.
Nümunə: fayldan sətir oxuma
try (BufferedReader reader = Files.newBufferedReader(
Paths.get("hello.txt"),
StandardCharsets.UTF_8)) {
String line = reader.readLine();
System.out.println("Oxundu: " + line);
}
Niyə bu vacibdir: Əgər fayl UTF-8-də saxlanıbsa, siz isə onu Windows-1251 kimi oxuyursunuzsa, kiril simvolları təhrif olunacaq. Düzgün kodlamanı göstərsəniz, mətn istənilən əməliyyat sistemində düzgün oxunacaq.
3. Kodlamanı göstərərək fayllara yazmaq
Köhnə üsul:
import java.io.*;
import java.nio.charset.StandardCharsets;
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("example.txt"),
StandardCharsets.UTF_8 // <-- Kodlamanı açıq şəkildə göstəririk
)
);
Müasir üsul:
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.io.BufferedWriter;
BufferedWriter writer = Files.newBufferedWriter(
Paths.get("example.txt"),
StandardCharsets.UTF_8 // <-- Kodlamanı açıq şəkildə göstəririk
);
Nümunə: fayla sətir yazmaq
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get("hello.txt"),
StandardCharsets.UTF_8)) {
writer.write("Salam, dünya!");
}
Nəticə: Fayl UTF-8-də saxlanacaq və UTF-8-i dəstəkləyən istənilən redaktorda düzgün açılacaq.
4. Faydalı nüanslar
Dəstəklənən kodlamaları necə öyrənmək olar
import java.nio.charset.Charset;
public class ListCharsets {
public static void main(String[] args) {
System.out.println("Mövcud kodlamalar:");
Charset.availableCharsets().forEach((name, charset) -> System.out.println(name));
}
}
Məsləhət: Əgər ekzotik bir kodlamadan istifadə edirsinizsə (məsələn, qədim Çin heroqlifləri və ya Mars smaylikləri üçün), onun JVM tərəfindən dəstəklənib-dəstəklənmədiyini yoxlayın.
try-with-resources istifadəsi: axınları bağlamağı unutmayaq
Fayllarla işləyərkən resurs sızmalarının qarşısını almaq üçün axınları bağlamaq vacibdir. Müasir Java kodu try-with-resources konstruksiyasından istifadə edir:
try (BufferedReader reader = Files.newBufferedReader(path, charset)) {
// Faylla işləyirik
}
Xəta baş versə belə, axın avtomatik bağlanacaq.
Tövsiyələr
- Faylları oxuyarkən və yazarkən kodlamanı həmişə açıq şəkildə göstərin — “standart olaraq hər şey işləyir” deyə əmin olsanız belə.
- Yeni fayllar üçün UTF-8 istifadə edin — bu de-fakto standartdır, xüsusən də web, JSON, XML ilə işləyirsinizsə və ya fayllarınızın hər yerdə oxunaqlı olmasını istəyirsinizsə.
- Köhnə fayllar üçün (məsələn, 1C-dən ixrac, köhnə verilənlər bazaları, Windows-dan CSV) onlar hansı kodlamada saxlanıblarsa, həmin kodlamadan istifadə edin (məsələn, Windows-1251, ISO-8859-1).
- Kodni açıq şəkildə göstərməyin mümkün olmadığı köhnəlmiş siniflərdən istifadə etməyin: FileReader/FileWriter. Onların əvəzinə kodlamanı açıq göstərərək InputStreamReader/OutputStreamWriter və ya Files metodlarını tətbiq edin.
- Böyük fayllar üçün yaddaşı həddən artıq istifadə etməmək üçün buferləşdirmədən istifadə edin (BufferedReader/BufferedWriter).
5. Kodlamalarla işləyərkən tipik səhvlər
Səhv №1: Faylı oxuyarkən/yazarkən kodlama göstərilməyib.
Kodlamanı göstərməsəniz, Java standart olaraq sistem kodlamasından ("file.encoding") istifadə edəcək. Sizin maşında hər şey işləyir, amma həmkarınızda — “qarışıq simvollar”.
Səhv №2: Oxuma və yazma zamanı kodlamaların uyğun gəlməməsi.
Fayl bir kodlamada yazılıb, başqa kodlamada oxunur. Məsələn, fayl UTF-8-də yazılıb, amma Windows-1251 kimi oxunur — kiril simvolları təhrif olunur.
Səhv №3: Köhnəlmiş FileReader/FileWriter siniflərindən istifadə.
Bu siniflər kodlamanı açıq şəkildə göstərməyə imkan vermir — onları istifadə etmək tövsiyə olunmur. Onların əvəzinə kodlamanı göstərməklə InputStreamReader/OutputStreamWriter və ya Files metodlarından istifadə edin.
Səhv №4: Kodlamanın adında səhv.
Məsələn, "utf8" əvəzinə "UTF-8" və ya "win1251" əvəzinə "Windows-1251" yazılıb. Java UnsupportedCharsetException atacaq.
Səhv №5: Axın bağlanmayıb — fayl yazılmadı.
Əgər try-with-resources istifadə etməsəniz və ya axını açıq şəkildə bağlamasanız, məlumatların bir hissəsi diskin üzərinə yazılmaya bilər.
GO TO FULL VERSION