本地文件讀取(csv,txt)時字符編碼問題解決
今天進行csv文件讀取時,老是入庫為空,因為其中有中文字符,我要通過中文字符映射成相應的編號(上升:1011,下降:1012),於是怎麽也取不到編號.剛開始以為程序映射出了問題,最後日誌打出來後,發現讀取的csv文件內容中文全為亂碼.啊啊啊,好坑.於是看了下別人寫的讀取csv文件的代碼,果然是沒有設置字符編碼.通過字符讀取文件,轉為字節流一定要進行字符編碼設置,否則跑到測試環境或生產環境會使用本地默認字符集,那就坑大了.
問題代碼:
BufferedReader in = new BufferedReader(new FileReader(this.inputCsvFile));
解決方式:
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(this.inputCsvFile), "UTF-8"));
就這兩行不同的代碼卻有著不同的效果,神奇吧.
接下來我就說一說原理,我覺得人家說的挺好,於是就引用人家說的.
Java的I/O類處理如圖:
Reader 類是 Java 的 I/O 中讀字符的父類,而 InputStream 類是讀字節的父類,InputStreamReader 類就是關聯字節到字符的橋梁,它負責在 I/O 過程中處理讀取字節到字符的轉換,而具體字節到字符的解碼實現它由 StreamDecoder 去實現,在 StreamDecoder 解碼過程中必須由用戶指定 Charset 編碼格式。值得註意的是如果你沒有指定 Charset,將使用本地環境中的默認字符集,例如在中文環境中將使用 GBK 編碼。
Java的I/O類處理圖
總結:Java讀取數據流的時候,一定要指定數據流的編碼方式,否則將使用本地環境中的默認字符集。
引用:
https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
http://sd8089730.iteye.com/blog/1290895
http://blog.csdn.net/greenqingqingws/article/details/7395213
本地文件讀取(csv,txt)時字符編碼問題解決