Java中properties文件中的中文亂碼問(wèn)題
Properties類(lèi)是什么?
Properties(Java.util.Properties),該類(lèi)主要用于讀取Java的配置文件,不同的編程語(yǔ)言有自己所支持的配置文件,配置文件中很多變量是經(jīng)常改變的,為了方便用戶(hù)的配置,能讓用戶(hù)夠脫離程序本身去修改相關(guān)的變量設(shè)置。就像在Java中,其配置文件常為.properties文件,是以鍵值對(duì)的形式進(jìn)行參數(shù)配置的。
Java中properties文件中的中文亂碼問(wèn)題
問(wèn)題代碼:
// 目標(biāo):使用Properties讀取屬性文件中的內(nèi)容。 // 1、創(chuàng)建properties對(duì)象 Properties properties = new Properties(); // 2、使用properties對(duì)象加載屬性文件中的鍵值對(duì)數(shù)據(jù)。 properties.load(new FileInputStream("day10-special-file-log\\src\\users.properties")); // 3、確認(rèn)是否讀取出來(lái)了 System.out.println(properties); // 4、根據(jù)鍵取值 String pwd = properties.getProperty("admin"); System.out.println(pwd); properties.forEach((k , v) -> { System.out.println(k + "=" + v); } );
day10-special-file-log\\src\\users.properties文件里面的內(nèi)容如下:
期望輸出應(yīng)該和上面文件的內(nèi)容一樣,結(jié)果中文內(nèi)容輸出的是一堆亂碼: 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"));就能正常輸出中文了,那這是什么原因呢?
其實(shí)properties文件中的中文亂碼問(wèn)題主要有以下幾個(gè)原因:
1.properties文件的編碼格式和Java代碼的編碼格式不一致。properties文件默認(rèn)使用ISO-8859-1編碼,而Java代碼可能使用UTF-8或GBK等編碼。這樣在讀取或?qū)懭雙roperties文件時(shí),就會(huì)出現(xiàn)中文字符無(wú)法正確解析的情況。
2.properties文件中的中文字符沒(méi)有經(jīng)過(guò)轉(zhuǎn)換。properties文件只能存儲(chǔ)ASCII字符,所以如果要使用中文字符,就需要將其轉(zhuǎn)換為Unicode編碼??梢允褂胣ative2ascii.exe工具或者IDE的插件來(lái)實(shí)現(xiàn)這個(gè)轉(zhuǎn)換。
3.在Java代碼中指定字符集。在使用FileInputStream或FileWriter等類(lèi)來(lái)讀取或?qū)懭雙roperties文件時(shí),需要指定相應(yīng)的字符集,例如UTF-8??梢允褂肐nputStreamReader或OutputStreamWriter等類(lèi)來(lái)包裝FileInputStream或FileWriter,并傳入相應(yīng)的字符集參數(shù)。
而properties.load(new FileReader(file))能正常讀取的原因是,F(xiàn)ileReader默認(rèn)使用了與properties文件相同的字符編碼,即UTF-8。這樣就可以正確地解析文件中的中文字符,而不會(huì)出現(xiàn)亂碼。
可以使用InputStreamReader或OutputStreamWriter等類(lèi)來(lái)包裝FileInputStream或FileWriter,并傳入相應(yīng)的字符集參數(shù)
示例代碼:
// 讀取文件時(shí)指定UTF-8編碼 Properties p = new Properties(); p.load(new InputStreamReader(new FileInputStream("config.properties"), "UTF-8")); // 寫(xiě)入文件時(shí)指定UTF-8編碼 Properties p = new Properties(); p.setProperty("name", "李芳"); p.store(new OutputStreamWriter(new FileOutputStream("config.properties"), "UTF-8"), null);
到此這篇關(guān)于Java中properties文件中的中文亂碼問(wèn)題的文章就介紹到這了,更多相關(guān)java properties文件中文亂碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot利用@Async異步調(diào)用:ThreadPoolTaskScheduler線程池的優(yōu)雅關(guān)閉詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot利用@Async異步調(diào)用:ThreadPoolTaskScheduler線程池的優(yōu)雅關(guān)閉的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05關(guān)于Intellij IDEA中的Version Control問(wèn)題
這篇文章主要介紹了Intellij IDEA中的Version Control問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11SpringBoot基于過(guò)濾器和內(nèi)存實(shí)現(xiàn)重復(fù)請(qǐng)求攔截功能
這篇文章主要介紹了SpringBoot基于過(guò)濾器和內(nèi)存實(shí)現(xiàn)重復(fù)請(qǐng)求攔截,這里我們使用過(guò)濾器的方式對(duì)進(jìn)入服務(wù)器的請(qǐng)求進(jìn)行過(guò)濾操作,實(shí)現(xiàn)對(duì)相同客戶(hù)端請(qǐng)求同一個(gè)接口的過(guò)濾,需要的朋友可以參考下2023-01-01java多線程開(kāi)發(fā)ScheduledExecutorService簡(jiǎn)化方式
這篇文章主要為大家介紹了java多線程開(kāi)發(fā)ScheduledExecutorService的簡(jiǎn)化方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Spring Boot的Controller控制層和頁(yè)面
這篇文章主要介紹了Spring Boot的Controller控制層和頁(yè)面,需要的朋友可以參考下2017-04-04Java的Struts框架中<results>標(biāo)簽的使用方法
這篇文章主要介紹了Java的Struts框架中<results>標(biāo)簽的使用方法,Struts框架是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-11-11基于Java實(shí)現(xiàn)Avro文件讀寫(xiě)功能
大家好,本篇文章主要講的是基于Java實(shí)現(xiàn)Avro文件讀寫(xiě)功能,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02