天天看點

Java BufferReader和FileReader讀取檔案中字元出現的亂碼問題

大概是這樣:

windows系統預設編碼為GBK,

如果你的eclipse工作空間編碼設為:UTF-8。

如果檔案中有中文則會亂碼。

先在N盤下建立一個test.txt檔案,裡面寫入一下内容,儲存。

Java BufferReader和FileReader讀取檔案中字元出現的亂碼問題

然後通過FileReader擷取test.txt的字元流,然後用BufferrReader讀取字元輸入流中的文本,并列印到控制台。

public static void main(String[] args) throws Exception {
		String str;
		FileReader file = new FileReader("n:/test.txt");
		BufferedReader reader = new BufferedReader(file);
		while((str=reader.readLine())!=null) {
			System.out.println(str);
		}
		file.close();
		reader.close();
	}
           

列印結果如下:

Java BufferReader和FileReader讀取檔案中字元出現的亂碼問題

出現亂碼。這是因為Windows系統的檔案以GBK的方式編碼,然後FileReader以工作空間預設的UTF-8方式解碼。是以才會出現亂碼。

相當于:

byte[] by = "好好學習,天天向上。".getBytes("gbk");
			String str3 = new String(by,"utf-8");
			System.out.println(str3);
           

如果以一下用new String(str.getBytes(“utf-8”),“gbk”),"utf-8"來還原編碼,"gbk"再重新解碼,看起來沒啥問題:但是通過實驗來看還是有問題的。

public static void main(String[] args) throws Exception {
		String str;
		FileReader file = new FileReader("n:/test.txt");
		BufferedReader reader = new BufferedReader(file);
		while((str=reader.readLine())!=null) {
			str=new String(str.getBytes("utf-8"),"gbk");
			System.out.println(str);
		}
		file.close();
		reader.close();
	}
           

結果如下:

Java BufferReader和FileReader讀取檔案中字元出現的亂碼問題

這和我們想要的結果不一樣,說明用"utf-8"編碼回去的過程中出現了錯誤,是以再用"GBK"解碼就會得到不正确的結果。

相當于:

byte[] by = "好好學習,天天向上。".getBytes("gbk");
			String str3 = new String(by,"utf-8");
			str3 = new String(str3.getBytes("utf-8"),"gbk");
			System.out.println(str3);
           

根據我現在的知識,解決方法有以下兩種:

1:把你的工作空間編碼方式改為"GBK"。

2:用InputStreamReader代替FileReader

代碼如下:

public static void main(String[] args) throws Exception {
		String str;
		InputStreamReader file = new InputStreamReader(new FileInputStream("n:/test.txt"),"GBk");
		//FileReader file = new FileReader("n:/test.txt");
		BufferedReader reader = new BufferedReader(file);
		while((str=reader.readLine())!=null) {
			//str=new String(str.getBytes("utf-8"),"gbk");
			System.out.println(str);
		}
		file.close();
		reader.close();
	}
           

通過以上代碼我們指明了以"GBK"的方式解碼,這樣它就不會用工作空間預設的解碼方式解碼了,運作結果如下:

Java BufferReader和FileReader讀取檔案中字元出現的亂碼問題

這和我們想要的結果一樣,OK,問題解決,還有什麼解決的方法就得自己慢慢了解了。