Saya mencoba menggunakan java.io.FileReader untuk membaca beberapa file teks dan mengonversinya menjadi string, tetapi saya menemukan hasilnya salah dikodekan dan tidak dapat dibaca sama sekali.
Inilah lingkungan saya:
Windows 2003, pengkodean OS: CP1252
Java 5.0
File saya dikodekan UTF-8 atau dikodekan CP1252, dan beberapa di antaranya (file yang dikodekan UTF-8) dapat berisi karakter China (non-Latin).
Saya menggunakan kode berikut untuk melakukan pekerjaan saya:
private static String readFileAsString(String filePath)
throws java.io.IOException{
StringBuffer fileData = new StringBuffer(1000);
FileReader reader = new FileReader(filePath);
//System.out.println(reader.getEncoding());
BufferedReader reader = new BufferedReader(reader);
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
Kode di atas tidak berfungsi. Saya menemukan pengkodean FileReader adalah CP1252 bahkan jika teksnya dikodekan UTF-8. Tetapi JavaDoc dari java.io.FileReader mengatakan bahwa:
Konstruktor kelas ini mengasumsikan bahwa pengkodean karakter default dan ukuran byte-buffer default adalah tepat.
Apakah ini berarti bahwa saya tidak diharuskan untuk mengatur pengkodean karakter sendiri jika saya menggunakan FileReader? Tapi saat ini saya mendapatkan data penyandian yang salah, apa cara yang benar untuk menangani situasi saya? Terima kasih.
Jawaban:
Ya, Anda perlu menentukan penyandian file yang ingin Anda baca.
Ya, ini artinya Anda harus mengetahui penyandian file yang ingin Anda baca.
Tidak, tidak ada cara umum untuk menebak penyandian file "teks biasa" apa pun yang diberikan.
Konstruktor satu argumen
FileReader
selalu menggunakan platform default encoding yang umumnya merupakan ide yang buruk .Karena Java 11
FileReader
juga mendapatkan konstruktor yang menerima pengkodean:new FileReader(file, charset)
dannew FileReader(fileName, charset)
.Di versi java sebelumnya, Anda harus menggunakan .
new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
sumber
InputStreamReader
apakahjava.io
kelas, itu akan menjadi "UTF8"?StandardCharsets.UTF_8
, tidak ada kemungkinan salah ketik di sana ;-) Tapi ya, jika Anda menggunakan string"UTF8"
akan benar (walaupun saya ingat bahwa itu akan menerima dua arah).Byte Order Mark
, bersama dengan .. yah .. menetapkan urutan byte! :) Karena itu saya merasa aneh bahwa FileReader Java tidak dapat secara otomatis mendeteksi UTF-16 yang memiliki BOM seperti itu ... Bahkan saya pernah menulis aUnicodeFileReader
yang melakukan hal itu. Sayangnya sumber tertutup, tetapi Google memilikinya UnicodeReader yang sangat mirip.FileReader
menggunakan penyandian default platform Java, yang tergantung pada pengaturan sistem komputer yang digunakannya dan umumnya penyandian paling populer di antara pengguna di lokal itu.Jika "tebakan terbaik" ini tidak benar, maka Anda harus menentukan pengkodean secara eksplisit. Sayangnya,
FileReader
tidak mengizinkan ini (pengawasan besar dalam API). Sebagai gantinya, Anda harus menggunakannew InputStreamReader(new FileInputStream(filePath), encoding)
dan idealnya mendapatkan encoding dari metadata tentang file tersebut.sumber
FileReader
Menggunakan penyandian default platform Java, yang tergantung pada pengaturan sistem komputer yang digunakannya dan umumnya penyandian paling populer di antara pengguna di lokal itu." Saya tidak akan mengatakan itu. Setidaknya dari Windows. Untuk beberapa alasan teknis / historis yang aneh, JVM mengabaikan fakta bahwa Unicode adalah pengkodean yang direkomendasikan pada Windows untuk 'semua aplikasi baru' dan sebaliknya selalu bertindak seolah-olah pengkodean lawas yang dikonfigurasikan sebagai cadangan untuk aplikasi lawas adalah 'platform default'.Karena Java 11 Anda dapat menggunakannya:
sumber
Untuk Java 7+ doc Anda dapat menggunakan ini:
Ini semua Charset doc
Misalnya jika file Anda ada di CP1252, gunakan metode ini
Berikut adalah nama kanonik lainnya untuk penyandian Java baik untuk IO dan NIO doc
Jika Anda tidak tahu dengan tepat pengkodean Anda sudah mendapat dalam file, Anda dapat menggunakan beberapa libs pihak ketiga seperti alat ini dari Google ini yang bekerja cukup rapi.
sumber
FileInputStream dengan InputStreamReader lebih baik daripada langsung menggunakan FileReader, karena yang terakhir tidak memungkinkan Anda untuk menentukan pengkodean charset.
Berikut adalah contoh menggunakan BufferedReader, FileInputStream dan InputStreamReader bersama-sama, sehingga Anda bisa membaca baris dari file.
sumber
Untuk yang lain sebagai bahasa Latin misalnya Cyrillic, Anda dapat menggunakan sesuatu seperti ini:
dan pastikan bahwa
.txt
file Anda disimpan dengan formatUTF-8
(tetapi bukan sebagai defaultANSI
). Bersulang!sumber