模板管理中,有一個功能,查看模板文件源碼,而且修改源碼的功能。apache
讀取一個UTF-8編碼格式的文件,代碼中起初用FileReader讀取到一個字符串,而後轉換字符集,結果就出問題了:數組
文件讀入時是按OS的默認字符集即GBK解碼的,我先用默認字符集GBK編碼str.getBytes(「GBK」),此時應該還原爲文件中的字節序列了,函數
而後再按UTF-8解碼,生成的字符串按理說應該就應該是正確的。工具
爲何結果中仍是有部分亂碼呢?編碼
問題出在FileReader讀取文件的過程當中,FileReader繼承了InputStreamReader,但並無實現父類中帶字符集參數的構造函數,spa
因此FileReader只能按系統默認的字符集來解碼,而後在UTF-8 -> GBK -> UTF-8的過程當中編碼出現損失,形成結果不能還原最初的字符。對象
如何解決呢?繼承
首先,我無論源文件是採用什麼編碼,取得文件流,而後用org.apache.commons.io.IOUtils.toByteArray這個工具類中的API字符串
FileInputStream stream = new FileInputStream(targetFile);get
byte[] bytes = IOUtils.toByteArray(stream);
這樣,就將文件流轉化成字節數組,而且不丟失字節;而後,每一個文件都有一段頭信息,描述文件的字符編碼,文件大小等等的信息,同一類字符編碼的文件,
頭幾個字節是相同的,能夠以此來判斷文件的字符編碼類型例如:UTF-8的文件,頭2個字節,分別是‘-17’和‘-69’,;接着能夠用String的帶字符集的構造函數,
把文件還原出來。
另外,clps中不單須要讀取源代碼,還須要修改源代碼,這時候,必定要保證編碼格式的一致性,我採用的方式,模仿了文件的格式,返回給頁面的
是一個文件對象,包含了文件內容實體,字符編碼格式等信息,這樣保存的時候,就能夠獲得這些信息。