Java讀取文本文件中文亂碼問題


最近遇到一個問題,Java讀取文本文件(例如csv文件、txt文件等),遇到中文就變成亂碼。讀取代碼如下:

 

[java]  view plain  copy
 
  1. List<String> lines=new ArrayList<String>();    
  2. BufferedReader br = new BufferedReader(new FileReader(fileName));  
  3. String line = null;  
  4. while ((line = br.readLine()) != null) {   
  5.       lines.add(line);  
  6. }  
  7. br.close();  

 

后來百度和Google了之后,終於找到原因,還是從原理開始講吧:

 

Java的I/O類處理如圖:

Reader 類是 Java 的 I/O 中讀字符的父類,而 InputStream 類是讀字節的父類,InputStreamReader 類就是關聯字節到字符的橋梁,它負責在 I/O 過程中處理讀取字節到字符的轉換,而具體字節到字符的解碼實現它由 StreamDecoder 去實現,在 StreamDecoder 解碼過程中必須由用戶指定 Charset 編碼格式。值得注意的是如果你沒有指定 Charset,將使用本地環境中的默認字符集,例如在中文環境中將使用 GBK 編碼。

Figure xxx. Requires a heading

                                    Java的I/O類處理圖

 

總結:Java讀取數據流的時候,一定要指定數據流的編碼方式,否則將使用本地環境中的默認字符集。

 

經過上述分析,修改之后的代碼如下:

 

[java]  view plain  copy
 
  1. List<String> lines=new ArrayList<String>();  
  2. BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));  
  3. String line = null;  
  4. while ((line = br.readLine()) != null) {  
  5.       lines.add(line);  
  6. }  
  7. br.close();  

 

參考資料:

http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

http://hi.baidu.com/annleecn/blog/item/154770ed900738db2e2e2151.html

http://sd8089730.iteye.com/blog/1290895

http://www.360doc.com/content/07/0403/09/16749_427888.shtml

 

本文轉載自:https://blog.csdn.net/mr_orange_klj/article/details/78563906


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM