在用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,否則無效
