一個關於FileReader讀檔案時有關編碼問題的試驗
阿新 • • 發佈:2018-12-24
由於在JAVA JDKAPI裡個人認為FileReader
的描述有些模糊,( 該類的建構函式假定預設字元編碼和預設位元組緩衝區大小是適當的),(也可能是渣翻版本本身的問題),搞不清楚
本文旨在測試:
FileReader究竟是以什麼編碼方式讀取的文字
所以設計了以下試驗
寫方法
以GBK和UTF-8分別寫了一個文字檔案
/*
* 類變數
*/
private static final String GBK_FILE = "txt_gbk.txt";
private static final String GBK = "gbk";
private static final String UTF8_FILE = "txt_utf8.txt";
private static final String UTF8 = "utf-8";
寫方法的實現,往檔案裡,寫了一個“你好呀”
/**
* @throws IOException
*/
public static void write(String fileName,String charset) throws IOException {
String str = "你好呀";
//寫
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter (new FileOutputStream(fileName),charset));
bw.write(str);
bw.close();
}
呼叫
write(UTF8_FILE,UTF8);
write(GBK_FILE,GBK);
utf-8的大小是9個位元組,gbk是6個。因為utf8的中文編碼是3個位元組一個漢字
讀方法
對比測試了預設讀和 自定義讀
預設讀的方法是使用了FileReader讀取字元流,自定義是用位元組流轉成的字元流,實現如下
/**
* 預設讀
* @throws IOException
*/
public static void showDefaultRead(String fileName) throws IOException {
//預設讀
BufferedReader br = new BufferedReader(new FileReader(fileName));
readLine(br);
}
/**
* 自定義讀
* @throws IOException
*/
public static void showCustomRead(String fileName,String charset) throws IOException {
//自定義讀
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),charset));
readLine(br);
}
/**
* 操作流進行行讀取
* @param br
* @throws IOException
*/
public static void readLine(BufferedReader br) throws IOException {
String line = null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
呼叫
//預設讀和用GBK的方式 同時讀取GBK的文字檔案
showDefaultRead(GBK_FILE);
showCustomRead(GBK_FILE,GBK);
System.out.println();
//預設讀和用utf8的方式 同時讀取GBK的文字檔案
showDefaultRead(GBK_FILE);
showCustomRead(GBK_FILE,UTF8);
System.out.println();
//預設讀和用GBK的方式 同時讀取UTF8的文字檔案
showDefaultRead(UTF8_FILE);
showCustomRead(UTF8_FILE,GBK);
System.out.println();
//預設讀和用utf8的方式 同時讀取UTF8的文字檔案
showDefaultRead(UTF8_FILE);
showCustomRead(UTF8_FILE,UTF8);
System.out.println();
輸出結果
���ѽ
你好呀
���ѽ
���ѽ
你好呀
浣犲ソ鍛�
你好呀
你好呀
結論
明顯可見,FileReader竟然是用UTF-8讀取的文字檔案?
結果其實和預想中有點不太一樣,或者說還有什麼本地的屬性可以影響嗎?還有待於確認
實驗結果暫時就是這樣了,有什麼問題請不吝賜教,謝謝