Java中Properties配置類用法詳解
一. Properties簡(jiǎn)介
1. 概述
在Java開(kāi)發(fā)中,我們經(jīng)常需要讀取和寫入配置文件,用來(lái)存儲(chǔ)程序中的一些配置信息,例如數(shù)據(jù)庫(kù)的連接信息、郵件和Web服務(wù)器的信息、消息隊(duì)列的信息等等。配置文件一般都是key-value形式,且它的key-value一般都是String-String類型的,因此我們完全可以用Map<String, String>來(lái)表示它。
但因?yàn)榕渲梦募貏e常用,所以Java集合庫(kù)給我們提供了一個(gè)Properties類來(lái)表示一組“配置”,專門用來(lái)處理key-value形式的配置信息。Properties類可以表示一個(gè)持久的屬性集,每個(gè)鍵及其對(duì)應(yīng)的值都是字符串類型,它可以把配置信息保存在一個(gè)IO流中,或是從一個(gè)IO流中加載配置信息,因此很適合用來(lái)處理配置文件。
Properties的內(nèi)部本質(zhì)上是一個(gè)Hashtable,該類從Hashtable中繼承了get()和put()方法,這些方法的參數(shù)簽名是Object。但由于歷史遺留原因,Properties的設(shè)計(jì)實(shí)際上是有問(wèn)題的,不過(guò)為了保持兼容性,現(xiàn)在已經(jīng)沒(méi)法修改了。所以我們?cè)谑褂肞roperties時(shí),不要去調(diào)用這些從Hashtable繼承來(lái)的方法,而應(yīng)該使用Properties自身關(guān)于讀寫配置的方法,比如getProperty()和setProperty()等方法。
2. 配置文件
既然今天我們想利用Properties類來(lái)對(duì)配置文件進(jìn)行讀取,所以首先我們得認(rèn)識(shí)一下什么是配置文件。在Java中,配置文件其實(shí)有多種格式,可以是 .txt、.xml、.properties、.yml、.json等格式,今天要給大家介紹的就是基于.properties格式的配置文件。
在Java中,其實(shí)默認(rèn)的配置文件就是以.properties為擴(kuò)展名的,該文件中的每行信息都是以key=value表示的,并用#進(jìn)行注釋。以下是一個(gè)典型的配置文件:
# db.properties #數(shù)據(jù)庫(kù)的url jdbc.url=jdbc:mysql://localhost:3306/mydb #用戶名 jdbc.username=root #密碼 jdbc.password=root
我們可以在eclipse等IDE工具中直接創(chuàng)建.properties文件,然后把上面的這些配置信息復(fù)制進(jìn)去即可。
3. 常用方法
我們?cè)谑褂肞roperties類讀寫配置文件時(shí),常常會(huì)用到以下方法:
public synchronized void load(InputStream inStream) throws IOException public synchronized void store(OutputStream out, String comments) throws IOException
其中,load()方法用于從指定的輸入流中讀取屬性列表(鍵和元素對(duì)),store()方法用于將Properties中的鍵值對(duì)存儲(chǔ)到指定的輸出流中。
4. 讀取步驟
在Java中利用Properties類讀取配置文件的信息,一般要經(jīng)歷如下三步:
創(chuàng)建 Properties 實(shí)例;
調(diào)用 load()方法 讀取配置文件;
調(diào)用 getProperty()方法 獲取具體的配置信息。
了解了以上這些內(nèi)容之后,接下來(lái),會(huì)通過(guò)幾個(gè)例子來(lái)給大家詳細(xì)地介紹Properties的使用方法。
二. 讀寫Properties配置文件
首先我們通過(guò)一個(gè)案例,來(lái)學(xué)習(xí)如何讀取Properties配置文件里的信息。
1. 創(chuàng)建Properties文件
為了方便測(cè)試,我們可以先在項(xiàng)目中創(chuàng)建一個(gè).properties的配置文件。這里就把該配置文件命名為db.properties了,如下圖所示:
大家要注意,在早期的JDK中, .properties配置 文件采用了ASCII編碼,具體來(lái)說(shuō)是ISO8859-1編碼。在這種編碼中,如果文件中存在中文,這些中文必須使用user name=\u4e2d\u6587
的形式來(lái)表示,非常別扭。而從JDK 9開(kāi)始, .properties配置 文件就可以使用UTF-8編碼了。
由于load(InputStream)方法默認(rèn)總是以ASCII編碼來(lái)讀取字節(jié)流,所以會(huì)導(dǎo)致讀取信息時(shí)產(chǎn)生亂碼,我們可以使用另一個(gè)load(Reader)重載方法來(lái)讀?。?/p>
Properties props = new Properties(); props.load(new FileReader("db.properties", StandardCharsets.UTF_8));
InputStream是字節(jié)流,Reader是字符流,因?yàn)樽址髟趦?nèi)存中已經(jīng)以char類型表示了,所以不涉及到編碼問(wèn)題。這樣通過(guò)以上代碼,我們就可以正常讀取包含中文的配置信息了。
2. 讀取Properties文件
2.1 加載配置文件
接下來(lái)我們可以使用Properties類的load()方法,來(lái)讀取上面創(chuàng)建的配置文件,例如:
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; /** * @author 一一哥Sun */ public class Demo23 { public static void main(String[] args) { //創(chuàng)建Properties對(duì)象 Properties properties = new Properties(); try { //設(shè)置db.properties配置文件,利用字節(jié)流來(lái)加載文件 //尋找.properties文件路徑方式一 //從當(dāng)前項(xiàng)目的根目錄下尋找db.properties文件 URL url = Demo23.class.getResource("/db.properties"); String path = url.getPath(); System.out.println("path="+path); InputStream inputStream = new FileInputStream(path); //尋找.properties文件路徑方式二 //InputStream inputStream = Demo23.class.getResourceAsStream("/db.properties"); //加載字節(jié)流 properties.load(inputStream); System.out.println("properties="+properties); } catch (IOException e) { e.printStackTrace(); } } }
在一個(gè)普通的Java項(xiàng)目中,如果我們想讀取.properties配置文件,可以有兩種方式:
類名.class.getResource("配置文件路徑及名稱") :該方式會(huì)得到一個(gè)URL對(duì)象,它代表了配置文件的路徑;
類名.class.getResourceAsStream("配置文件路徑及名稱") :該方式會(huì)直接得到InputStream對(duì)象。
在上面的代碼中,我們讀取到了名為db.properties的配置文件,并將其存儲(chǔ)在一個(gè)Properties對(duì)象中。
2.2 讀取配置信息
在上面的代碼中,我們從配置文件中讀取了三個(gè)鍵值對(duì),分別是jdbc.url、jdbc.username和jdbc.password。在讀取配置文件后,接下來(lái)我們就可以通過(guò)getProperty()方法來(lái)獲取配置信息了。如果配置文件中不存在這些鍵,getProperty()方法將會(huì)返回null。
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; /** * @author 一一哥Sun */ public class Demo23 { public static void main(String[] args) { //創(chuàng)建Properties對(duì)象 Properties properties = new Properties(); try { //設(shè)置db.properties配置文件,利用字節(jié)流來(lái)加載文件 //尋找.properties文件路徑方式一 //從當(dāng)前項(xiàng)目的根目錄下尋找db.properties文件 URL dbUrl = Demo23.class.getResource("/db.properties"); String path = dbUrl.getPath(); System.out.println("path="+path); InputStream inputStream = new FileInputStream(path); //尋找.properties文件路徑方式二 //InputStream inputStream = Demo23.class.getResourceAsStream("/db.properties"); //加載字節(jié)流 properties.load(inputStream); System.out.println("properties="+properties); //從配置文件中根據(jù)指定的key來(lái)讀取配置信息 String url = properties.getProperty("jdbc.url"); String username = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); System.out.println("[url]="+url+" ,[username]="+username+" ,[password]="+password); } catch (IOException e) { e.printStackTrace(); } } }
要注意,我們?cè)谡{(diào)用 getProperty()方法 獲取配置信息時(shí),如果指定的key不存在,會(huì)返回 null 。但我們可以提供一個(gè)默認(rèn)值,這樣當(dāng)key不存在時(shí)會(huì)返回一個(gè)默認(rèn)值。 并且如果有多個(gè).properties文件,可以反復(fù)調(diào)用load()讀取,后讀取的key-value會(huì)覆蓋已讀取的key-value。
2.3 使用默認(rèn)值讀取信息
在讀取配置文件時(shí),如果某個(gè)鍵不存在,getProperty()方法將返回null。為了避免出現(xiàn)NullPointerException,我們可以為getProperty()方法指定一個(gè)默認(rèn)值,例如:
String url = properties.getProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb"); String username = properties.getProperty("jdbc.username", "root"); String password = properties.getProperty("jdbc.password", "root");
在以上代碼中,如果配置文件中不存在jdbc.url這個(gè)鍵,getProperty方法會(huì)返回我們?cè)O(shè)置的默認(rèn)值"jdbc:mysql://localhost:3306/mydb"。
3. 寫入Properties文件
接下來(lái)我們?cè)偻ㄟ^(guò)一個(gè)案例,來(lái)學(xué)習(xí)如何把配置信息寫入到Properties文件里。
3.1 寫入配置文件
我們可以使用Properties類的store方法來(lái)寫入配置文件,例如:
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Properties; /** * @author */ public class Demo24 { public static void main(String[] args) { //設(shè)置配置信息 Properties properties = new Properties(); properties.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb2"); properties.setProperty("jdbc.username", "root"); properties.setProperty("jdbc.password", "syc"); try { URL dbUrl = Demo24.class.getResource("/db.properties"); String path = dbUrl.getPath(); System.out.println("path="+path); OutputStream outputStream = new FileOutputStream(path); //寫入配置信息 properties.store(outputStream, "Database connection properties"); // 尋找.properties文件路徑方式二 InputStream inputStream = Demo24.class.getResourceAsStream("/db.properties"); // 加載字節(jié)流 properties.load(inputStream); System.out.println("properties=" + properties); } catch (IOException e) { e.printStackTrace(); } } }
以上代碼中,將三個(gè)鍵值對(duì)寫入到了名為db.properties的配置文件中,并添加了一行注釋“Database connection properties”。
3.2 使用默認(rèn)值寫入信息
另外在Properties類中,其實(shí)本身就有一個(gè)默認(rèn)的Properties對(duì)象,可以用來(lái)設(shè)置一些默認(rèn)屬性值。我們可以使用Properties類的getDefaultProperties()方法來(lái)獲取默認(rèn)的Properties對(duì)象,然后使用setProperty()方法來(lái)設(shè)置默認(rèn)屬性值,例如:
Properties defaultProperties = Properties.getDefaultProperties(); defaultProperties.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb"); defaultProperties.setProperty("jdbc.username", "root"); defaultProperties.setProperty("jdbc.password", "root"); Properties properties = new Properties(defaultProperties);
以上代碼中,我們先獲取了默認(rèn)的Properties對(duì)象,然后設(shè)置了jdbc.url、jdbc.username和jdbc.password三個(gè)默認(rèn)屬性值。接著,我們創(chuàng)建了一個(gè)新的Properties對(duì)象,并將默認(rèn)的Properties對(duì)象傳遞給它。這樣,在讀取配置文件時(shí),如果某個(gè)鍵不存在,getProperty方法就會(huì)先在當(dāng)前Properties對(duì)象中查找,如果找不到,就會(huì)在默認(rèn)Properties對(duì)象中查找。
四. 讀寫XML配置文件
其實(shí)Properties類不僅可以操作.properties配置文件,也可以操作.xml格式的文件,接下來(lái)再給大家講一下如何操作xml文件。
1. 創(chuàng)建XML文件
首先我們來(lái)創(chuàng)建一個(gè)xml格式的配置文件,如下所示
<?xml version="1.0" encoding="UTF-8"?> <!-- 聲明一個(gè)properties屬性節(jié)點(diǎn) --> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="jdbc.url">jdbc:mysql://localhost:3306/mydb</entry> <entry key="jdbc.username">root</entry> <entry key="jdbc.password">root</entry> </properties>
大家要注意,這里我們要使用<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
語(yǔ)句來(lái)聲明一個(gè)properties根結(jié)點(diǎn),大家可以根據(jù)自己的需要定義自己的節(jié)點(diǎn)名稱。
2. 讀取XML配置文件
要想讀取XML格式的配置文件,可以使用loadFromXML()方法從XML文件中讀取配置信息,例如:
import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * @author 一一哥Sun */ public class Demo25 { public static void main(String[] args) { // 創(chuàng)建Properties對(duì)象 Properties properties = new Properties(); try { // 從當(dāng)前項(xiàng)目的根目錄下尋找db.properties文件 InputStream inputStream = Demo25.class.getResourceAsStream("/config.xml"); // 加載字節(jié)流,從XML文件中讀取配置信息 properties.loadFromXML(inputStream); // 從配置文件中根據(jù)指定的key來(lái)讀取配置信息 // 讀取信息時(shí)設(shè)置默認(rèn)值 String url = properties.getProperty("jdbc.url","jdbc:mysql://localhost:3306/mydb2"); String username = properties.getProperty("jdbc.username", "syc"); String password = properties.getProperty("jdbc.password", "syc"); System.out.println("[url]="+url+" ,[username]="+username+" ,[password]="+password); } catch (IOException e) { e.printStackTrace(); } } }
以上代碼讀取了名為config.xml的XML配置文件,并將其存儲(chǔ)在一個(gè)Properties對(duì)象中。在讀取XML格式的配置文件后,我們就可以通過(guò)getProperty方法來(lái)獲取配置信息了。
3. 寫入XML配置文件
同時(shí),我們也可以使用storeToXML()方法,將Properties中的鍵值對(duì)信息存儲(chǔ)到XML格式的輸出流中,例如:
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Properties; /** * @author */ public class Demo26 { public static void main(String[] args) { // 設(shè)置配置信息 Properties properties = new Properties(); properties.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb2"); properties.setProperty("jdbc.username", "root"); properties.setProperty("jdbc.password", "syc"); try { URL dbUrl = Demo26.class.getResource("/config.xml"); String path = dbUrl.getPath(); OutputStream outputStream = new FileOutputStream(path); // 寫入配置信息 properties.storeToXML(outputStream, "Database connection properties"); // 尋找.properties文件路徑方式二 InputStream inputStream = Demo26.class.getResourceAsStream("/config.xml"); // 加載字節(jié)流 properties.loadFromXML(inputStream); System.out.println("xml=" + properties); } catch (IOException e) { e.printStackTrace(); } } }
在以上代碼中,我們將三個(gè)鍵值對(duì)寫入了一個(gè)名為config.xml的XML配置文件中,并添加了一行注釋“Database connection properties”。
五. 結(jié)語(yǔ)
在本文中,為大家詳細(xì)介紹了Java中的Properties配置類,它是用來(lái)處理配置文件的一個(gè)實(shí)用工具類,該類可以從文件系統(tǒng)、classpath或其他任何地方讀取.properties文件。我們?cè)谧x寫Properties時(shí),注意僅使用getProperty()和setProperty()方法,不要調(diào)用繼承而來(lái)的get()和put()等方法。
通過(guò)本文的介紹,相信大家已經(jīng)掌握了Properties類的基本用法,包括讀寫配置文件、設(shè)置默認(rèn)值、讀寫XML格式的配置文件等等。在實(shí)際開(kāi)發(fā)中,我們可以結(jié)合Properties類來(lái)實(shí)現(xiàn)程序的配置功能,提高程序的靈活性和可維護(hù)性。
以上就是Java中Properties配置類用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java Properties配置類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring boot集成rabbitmq的實(shí)例教程
這篇文章主要給大家介紹了關(guān)于spring boot集成rabbitmq的相關(guān)資料,springboot集成RabbitMQ非常簡(jiǎn)單,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Java并發(fā)之異步的八種實(shí)現(xiàn)方式
本文主要介紹了Java并發(fā)之異步的八種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06淺談Spring Boot 2.0遷移指南主要注意點(diǎn)
Spring官方的Spring Boot 2變動(dòng)指南,主要是幫助您將應(yīng)用程序遷移到Spring Boot 2.0,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解
這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09