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