問題代碼: 1 // 目標:使用Properties讀取屬性文件中的內容。 2 // 1、創建properties對象 3 Properties properties = new Properties(); 4 5 6 // 2、使用properties對象載入屬性文件中的鍵值對數據。 7 prop ...
問題代碼:
1 // 目標:使用Properties讀取屬性文件中的內容。 2 // 1、創建properties對象 3 Properties properties = new Properties(); 4 5 6 // 2、使用properties對象載入屬性文件中的鍵值對數據。 7 properties.load(new FileInputStream("day10-special-file-log\\src\\users.properties")); 8 9 // 3、確認是否讀取出來了 10 System.out.println(properties); 11 12 // 4、根據鍵取值 13 String pwd = properties.getProperty("admin"); 14 System.out.println(pwd); 15 16 properties.forEach((k , v) -> { 17 System.out.println(k + "=" + v); 18 } );
day10-special-file-log\\src\\users.properties文件裡面的內容如下:
期望輸出應該和上面文件的內容一樣,結果中文內容輸出的是一堆亂碼: 1 å¼ æ å¿=minmin 2 å¨è·è¥=miejue 3 èµµæ=wuji 4 admin=123456
可如果將上面 properties.load(new FileInputStream("day10-special-file-log\\src\\users.properties"));換成 properties.load(new FileReader("day10-special-file-log\\src\\users.properties"));就能正常輸出中文了,那這是什麼原因呢?
其實properties文件中的中文亂碼問題主要有以下幾個原因:
1.properties文件的編碼格式和Java代碼的編碼格式不一致。properties文件預設使用ISO-8859-1編碼,而Java代碼可能使用UTF-8或GBK等編碼。這樣在讀取或寫入properties文件時,就會出現中文字元無法正確解析的情況。
2.properties文件中的中文字元沒有經過轉換。properties文件只能存儲ASCII字元,所以如果要使用中文字元,就需要將其轉換為Unicode編碼。可以使用native2ascii.exe工具或者IDE的插件來實現這個轉換。
3.在Java代碼中指定字元集。在使用FileInputStream或FileWriter等類來讀取或寫入properties文件時,需要指定相應的字元集,例如UTF-8。可以使用InputStreamReader或OutputStreamWriter等類來包裝FileInputStream或FileWriter,並傳入相應的字元集參數。
而properties.load(new FileReader(file))能正常讀取的原因是,FileReader預設使用了與properties文件相同的字元編碼,即UTF-8。這樣就可以正確地解析文件中的中文字元,而不會出現亂碼。
可以使用InputStreamReader或OutputStreamWriter等類來包裝FileInputStream或FileWriter,並傳入相應的字元集參數
示例代碼:
// 讀取文件時指定UTF-8編碼 Properties p = new Properties(); p.load(new InputStreamReader(new FileInputStream("config.properties"), "UTF-8")); // 寫入文件時指定UTF-8編碼 Properties p = new Properties(); p.setProperty("name", "李芳"); p.store(new OutputStreamWriter(new FileOutputStream("config.properties"), "UTF-8"), null);