Java 输入输出流 解决中文乱码问题【不一定详细但一定实用篇】【全文4800字】
生活随笔
收集整理的這篇文章主要介紹了
Java 输入输出流 解决中文乱码问题【不一定详细但一定实用篇】【全文4800字】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??在Java IO流的學習過程中,對 txt 形式的文本文件進行寫入/寫出操作時,出現了 中文亂碼 的現象,經過不懈地努力下,查閱相關資料后得以解決。現記錄一下自己的解決過程,希望能幫到大家。
實驗環境:
Netbeans IDE 11.2、JDK1.8等
問題闡述:
剛開始我向文本文件輸入中文時,出現了以下問題:
以下是代碼部分【已加上詳細注釋,若想深入了解 IO機制 ,請查看附錄連接[3]】
package AllJavaExperiments; import java.io.*; /**** @author NJUPT_wly*/ public class JavaExperiment_3 {public static void main(String[] args) throws IOException{InputStreamReader isr = new InputStreamReader(System.in); //定義標準輸入流【注:這是“字節”輸入流】BufferedReader bin_1 = new BufferedReader(isr); //獲取緩沖輸入流【注:它是一個裝飾器】//注:將BufferedReader/BufferedWriter與文件流一起使用,可以減少 緩沖區功能匹配CPU 與 I/O的處理速度 的差異File outputFile = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt"); //構造File類實例【接下來就可以對該實例進行相應的操作】FileWriter out = new FileWriter(outputFile); //基于“字符”的輸出操作BufferedWriter bout = new BufferedWriter(out); //獲取緩沖輸出流【注:它是一個裝飾器】String s;System.out.println("-----以下是將要寫入outTest文件的數據:(以單行“#”結束)-----");try{while( (s = bin_1.readLine()) != null ){if( "#".equals(s) )break;//System.out.println(s);bout.write(s);bout.newLine(); //轉到下一行}}catch( IOException e ){ //若輸入有異常,則執行下面一條語句System.out.println("There is a error!");}bin_1.close(); //最先關閉緩沖輸入流isr.close(); //在關閉標準輸入流bout.flush(); //清空緩沖區bout.close(); //關閉緩沖輸出流,釋放和這個流相關的系統資源【】out.close(); //在關閉文件輸出流System.out.println("-----以下是從outTest文件讀出的數據:-----");File fin = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt");FileReader finReader = new FileReader(fin); //基于“字符”的輸入操作BufferedReader bin_2 = new BufferedReader(finReader);String ss;while( (ss = bin_2.readLine()) != null ){System.out.println(ss); //輸出到命令行窗口}bin_2.close(); //依次關閉,注意關閉順序finReader.close();} }
查閱了很多資料后,終于解決了問題:
接下來分別記錄一下:
??1、解決方法
??2、為什么要這樣解決?
-----------------------------------分割線------------------------------------------
1、解決方法:
??只需要在 標準輸入流函數內 增加一個參數 "gbk"即可。2、為什么要這樣解決?【引用附錄鏈接[2]】
??1. 系統的編碼和 程序的編碼各采用了不同的編碼格式。??2.通常,假如自己不修改的話,windows自身采用的編碼格式是 gbk(而 gbk和 gb2312基本上是一樣的編碼方式).
??3.而IDE中默認是 utf-8的編碼,這就是為什么會出現亂碼的原因。
??4.當在OS下手工創建并寫入的txt文件( 編碼形式為gbk),用程序直接去讀( 編碼形式為utf-8),就會出現亂碼。
以下是修改后的代碼:
package AllJavaExperiments; import java.io.*; /**** @author NJUPT_wly*/ public class JavaExperiment_3 {public static void main(String[] args) throws IOException{InputStreamReader isr = new InputStreamReader(System.in,"gbk"); //以“gbk”方式定義標準輸入流【注:這是“字節”輸入流】BufferedReader bin_1 = new BufferedReader(isr); //獲取緩沖輸入流【注:它是一個裝飾器】//注:將BufferedReader/BufferedWriter與文件流一起使用,可以減少 緩沖區功能匹配CPU 與 I/O的處理速度 的差異File outputFile = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt"); //構造File類實例【接下來就可以對該實例進行相應的操作】FileWriter out = new FileWriter(outputFile); //基于“字符”的輸出操作BufferedWriter bout = new BufferedWriter(out); //獲取緩沖輸出流【注:它是一個裝飾器】String s;System.out.println("-----以下是將要寫入outTest文件的數據:(以單行“#”結束)-----");try{while( (s = bin_1.readLine()) != null ){if( "#".equals(s) )break;//System.out.println(s);bout.write(s);bout.newLine(); //轉到下一行}}catch( IOException e ){ //若輸入有異常,則執行下面一條語句System.out.println("There is a error!");}bin_1.close(); //最先關閉緩沖輸入流isr.close(); //在關閉標準輸入流bout.flush(); //清空緩沖區bout.close(); //關閉緩沖輸出流,釋放和這個流相關的系統資源【】out.close(); //在關閉文件輸出流System.out.println("-----以下是從outTest文件讀出的數據:-----");File fin = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt");FileReader finReader = new FileReader(fin); //基于“字符”的輸入操作BufferedReader bin_2 = new BufferedReader(finReader);String ss;while( (ss = bin_2.readLine()) != null ){System.out.println(ss); //輸出到命令行窗口}bin_2.close(); //依次關閉,注意關閉順序finReader.close();} }運行結果圖片:
參考附錄:
[1] 《ANSI是什么編碼?》【桌面上txt文件默認為ANSI編碼形式,那ANSI是什么呢? 通過這篇文章,你可以比較系統地學習到:各種編碼的由來和原理】
鏈接: ANSI是什么編碼?.
[2] 《Java讀寫中文文件,解決中文亂碼問題 》【這篇文章就是我在文中所引用的】
鏈接: Java讀寫中文文件,解決中文亂碼問題.
[3] 《深入理解Java中的IO》【通過這篇文章你可以系統地學習Java中的輸入輸出流的原理及實現】
鏈接: 深入理解Java中的IO.
后記:感謝以上博主。這是小生第一篇博文,疏漏之處還望海涵,煩請指正。
總結
以上是生活随笔為你收集整理的Java 输入输出流 解决中文乱码问题【不一定详细但一定实用篇】【全文4800字】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kaggle TMDB5000电影数据分
- 下一篇: java美元兑换,(Java实现) 美元