一、情況
程序中通過讀取 properties 配置文件來完成設置參數等功能,但是當配置文件中存在中文時,再通過以下(錯誤示范)代碼進行讀取並取值時,當值為中文時,則中文亂碼(英文等字符不受影響)
// 錯誤示范代碼
Properties properties = new Properties();
InputStream inputStream = TestClass.class.getResourceAsStream("/ScreenShotParams.properties");
properties.load(inputStream);
String saveLocationDir = properties.getProperty("saveLocationDir");
LOGGER.info("saveLocationDir:" + saveLocationDir);
二、分析
InputStream 字節流來讀取中文字符,肯定亂碼啦,改用字符流試試?
三、解決
// 正確代碼
Properties properties = new Properties();
InputStream inputStream = TestClass.class.getResourceAsStream("/ScreenShotParams.properties");
InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");
BufferedReader br = new BufferedReader(isr);
// 一定一定要 load 設置編碼后的字符流
properties.load(br);
String saveLocationDir = properties.getProperty("saveLocationDir");
LOGGER.info("saveLocationDir:" + saveLocationDir);
按以上正確代碼讀取配置時,仍中文亂碼的情況時
-
通過記事本等工具檢查並修改配置文件的編碼格式為 UTF-8,然后再在代碼中按照 UTF-8 格式編碼進行讀取
-
檢查 properties.load() 的參數是否是編碼讀取后的字符流,如果還是 InputStream 字節流時則不會生效,該亂碼還亂碼
四、知識點
-
雖然 InputStreamReader 也能滿足中文不亂碼的要求,但是還是采用 BufferReader 會更加高效
-
保證中文不亂碼的前提是:編碼和解碼的格式要保持一致,比如編碼是 UTF-8,則解碼格式也一定要是 UTF-8
-
在 IDEA 中創建的 properties 后綴名文件,在記事本中查看時,為 ANSI 格式,不過可以通過記事本等工具將文件格式修改為 UTF-8
-
英文,數字,符號等占用兩個字節,中文占用三個字節