在用Java程序進行讀寫含中文的txt文件時,經常會出現讀出或寫入的內容會出現亂碼。原因其實很簡單,就是系統的編碼和程序的編碼采用了不同的編碼格式。通常,假如自己不修改的話,windows自身采用的編碼格式是gbk(而gbk和gb2312基本上是一樣的編碼方式),而IDE中Encode不修改的話,默認是utf-8的編碼,這就是為什么會出現亂碼的原因。當在OS下手工創建並寫入的txt文件(gbk),用程序直接去讀(utf-8),就會亂碼。為了避免可能的中文亂碼問題,最好在文件寫入和讀出的時候顯式指定編碼格式。
可以觀察其實windows下的記事本的默認的格式是ANSI,查看方式就是創建一個新的文本文件然后點擊另存為
在簡體中文Windows操作系統中,ANSI 編碼代表 GBK 編碼,所以win系統的編碼方式是gbk,不可以用utf-8去讀,
在Java中,如果我們用java.io.FileReader或者java.io.FileWriter來讀寫文件的話,固然我們可以通過 java.io.BufferedReader和java.io.BufferedWriter來提高效率,但是我們會發現在FileReader和 FileWriter中我們只能獲取編碼方式,而不能設置。這樣,在FileReader和FileWriter中的編碼設置只能服從於一些更為底層的設置,那么在讀寫多種語言編碼的文件時就很容易出現亂碼。
另外一種方法就是采用java.io.FileInputStream/java.io.InputStreamReader和 java.io.FileOutputStream/java.io.OutputStreamWriter來解決這個問題。在 InputStreamReader和OutputStreamWriter中,可以通過指定編碼方式來完成gbk文件的讀寫。
//默認情況下,win系統編碼是gbk/gbk2312,讀取和寫入時加入編碼字符集可以解決亂碼 public class ReadAndWrite { private static void test(){ File firstFile = new File("D://fileone.txt"); File secondFile=new File("D://filesecond.txt"); BufferedReader in = null; BufferedWriter out = null; try { in = new BufferedReader(new InputStreamReader(new FileInputStream(firstFile), "gbk")); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(secondFile), "gbk")); String line = ""; while((line = in.readLine())!=null){ System.out.println(line); out.write(line+"\r\n"); } } catch (FileNotFoundException e) { System.out.println("file is not fond"); } catch (IOException e) { System.out.println("Read or write Exceptioned"); }finally{ if(null!=in){ try { in.close(); } catch (IOException e) { e.printStackTrace(); }} if(null!=out){ try { out.close(); } catch (IOException e) { e.printStackTrace(); }}}} }
還有一定要寫BufferedWriter out的close不然什么都不會被寫入文件的,這點至關重要!!!注意要寫入換行時,一定要\r\n,否則無效