FileReader讀取文件,因爲不肯定源文件的編碼格式不一樣,致使讀出的文件亂碼的問題

 

讀取一個UTF-8編碼格式的文件,代碼中起初用FileReader讀取到一個字符串,而後轉換字符集,結果就出問題了:apache

文件讀入時是按OS的默認字符集即GBK解碼的,我先用默認字符集GBK編碼str.getBytes(「GBK」),此時應該還原爲文件中的字節序列了,數組

而後再按UTF-8解碼,生成的字符串按理說應該就應該是正確的。函數

爲何結果中仍是有部分亂碼呢?工具

問題出在FileReader讀取文件的過程當中,FileReader繼承了InputStreamReader,但並無實現父類中帶字符集參數的構造函數,編碼

因此FileReader只能按系統默認的字符集來解碼,而後在UTF-8 -> GBK -> UTF-8的過程當中編碼出現損失,形成結果不能還原最初的字符。spa

以前還碰到過一個問題,讀取一個別人上傳的文件,原本約束是這個文件啊必須是UTF-8的,可是用戶上傳的文件,倒是用GBK對象

編碼的,致使將這個文件流讀出,使用時,發現亂碼沒法真確識別其中信息。繼承

如何解決呢?字符串

首先,我無論源文件是採用什麼編碼,取得文件流,而後用org.apache.commons.io.IOUtils.toByteArray這個工具類中的APIget

FileInputStreamstream = new FileInputStream(targetFile);

byte[] bytes = IOUtils.toByteArray(stream);

這樣,就將文件流轉化成字節數組,而且不丟失字節;而後,每一個文件都有一段頭信息,描述文件的字符編碼,文件大小等等的信息,同一類字符編碼的文件,

頭幾個字節是相同的,能夠以此來判斷文件的字符編碼類型例如:UTF-8的文件,頭2個字節,分別是‘-17’和‘-69’,;接着能夠用String的帶字符集的構造函數,

把文件還原出來。

另外,clps中不單須要讀取源代碼,還須要修改源代碼,這時候,必定要保證編碼格式的一致性,我採用的方式,模仿了文件的格式,返回給頁面的

是一個文件對象,包含了文件內容實體,字符編碼格式等信息,這樣保存的時候,就能夠獲得這些信息。

相關文章
相關標籤/搜索