本文將為大家詳細講解Java中Properties配置類怎么用,這是我們進行開發時經常用到的知識點,也是大家在學習Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題!
文章較長,干貨滿滿,建議大家收藏慢慢學習,文末有本文重點總結,主頁有全系列文章分享,技術類問題,歡迎大家和我們一起交流討論!
前言
在前面的幾篇文章中,給大家講解了Java里的List、Set和Map等集合,
所以現在我們知道,Map集合作為一個雙列集合,有key和value兩個值,這兩個值共同組成了key-value鍵值對的映射關系,而正是這種映射關系,使得Map集合可以解決我們在開發時遇到的組態檔問題,
所謂的組態檔問題,是指我們在開發時,經常需要讀取和修改一些配置資訊,比如資料庫、訊息佇列、Nginx、Web服務器等的配置,這些配置資訊在測驗環境、開發環境和線上環境里的值是不同的,我們經常需要在幾種環境中反復地修改配置資訊,為了便于修改這些資訊,我們可以采用Map集合來對這些資訊進行封裝和操作,尤其是給我們提供了一個Properties配置類,更是方便了我們的操作,那么今天,就給大家講一下Properties配置類是怎么回事,以及怎么使用,
全文大約【3600】 字,不說廢話,只講可以讓你學到技術、明白原理的純干貨!本文帶有豐富的案例及配圖視頻,讓你更好地理解和運用文中的技術概念,并可以給你帶來具有足夠啟迪的思考...
一. Properties簡介
1. 概述
在Java開發中,我們經常需要讀取和寫入組態檔,用來存盤程式中的一些配置資訊,例如資料庫的連接資訊、郵件和Web服務器的資訊、訊息佇列的資訊等等,組態檔一般都是key-value形式,且它的key-value一般都是String-String型別的,因此我們完全可以用Map<String, String>來表示它,
但因為組態檔特別常用,所以Java集合庫給我們提供了一個Properties類來表示一組“配置”,專門用來處理key-value形式的配置資訊,Properties類可以表示一個持久的屬性集,每個鍵及其對應的值都是字串型別,它可以把配置資訊保存在一個IO流中,或是從一個IO流中加載配置資訊,因此很適合用來處理組態檔,
Properties的內部本質上是一個Hashtable,該類從Hashtable中繼承了get()和put()方法,這些方法的引數簽名是Object,但由于歷史遺留原因,Properties的設計實際上是有問題的,不過為了保持兼容性,現在已經沒法修改了,所以我們在使用Properties時,不要去呼叫這些從Hashtable繼承來的方法,而應該使用Properties自身關于讀寫配置的方法,比如getProperty()和setProperty()等方法,
2. 組態檔
既然今天我們想利用Properties類來對組態檔進行讀取,所以首先我們得認識一下什么是組態檔,在Java中,組態檔其實有多種格式,可以是 .txt、.xml、.properties、.yml、.json等格式,今天要給大家介紹的就是基于.properties格式的組態檔,
在Java中,其實默認的組態檔就是以.properties為擴展名的,該檔案中的每行資訊都是以key=value表示的,并用#進行注釋,以下是一個典型的組態檔:
# db.properties
\#資料庫的url
jdbc.url=jdbc:mysql://localhost:3306/mydb
\#用戶名
jdbc.username=root
\#密碼
jdbc.password=root
我們可以在eclipse等IDE工具中直接創建.properties檔案,然后把上面的這些配置資訊復制進去即可,
3. 常用方法
我們在使用Properties類讀寫組態檔時,常常會用到以下方法:
public synchronized void load(InputStream inStream) throws IOException
public synchronized void store(OutputStream out, String comments) throws IOException
其中,load()方法用于從指定的輸入流中讀取屬性串列(鍵和元素對),store()方法用于將Properties中的鍵值對存盤到指定的輸出流中,
4. 讀取步驟
在Java中利用Properties類讀取組態檔的資訊,一般要經歷如下三步:
- 創建 Properties 實體;
- 呼叫 load()方法 讀取組態檔;
- 呼叫 getProperty()方法 獲取具體的配置資訊,
了解了以上這些內容之后,接下來,會通過幾個例子來給大家詳細地介紹Properties的使用方法,
二. 讀寫Properties組態檔
首先我們通過一個案例,來學習如何讀取Properties組態檔里的資訊,
1. 創建Properties檔案
為了方便測驗,我們可以先在專案中創建一個.properties的組態檔,這里就把該組態檔命名為db.properties了,如下圖所示:
大家要注意,在早期的JDK中, .properties配置 檔案采用了ASCII編碼,具體來說是ISO8859-1編碼,在這種編碼中,如果檔案中存在中文,這些中文必須使用user name=\u4e2d\u6587的形式來表示,非常別扭,而從JDK 9開始, .properties配置 檔案就可以使用UTF-8編碼了,
由于load(InputStream)方法默認總是以ASCII編碼來讀取位元組流,所以會導致讀取資訊時產生亂碼,我們可以使用另一個load(Reader)多載方法來讀取:
Properties props = new Properties();
props.load(new FileReader("db.properties", StandardCharsets.UTF_8));
InputStream是位元組流,Reader是字符流,因為字符流在記憶體中已經以char型別表示了,所以不涉及到編碼問題,這樣通過以上代碼,我們就可以正常讀取包含中文的配置資訊了,
2. 讀取Properties檔案
2.1 加載組態檔
接下來我們可以使用Properties類的load()方法,來讀取上面創建的組態檔,例如:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
public class Demo23 {
public static void main(String[] args) {
//創建Properties物件
Properties properties = new Properties();
try {
//設定db.properties組態檔,利用位元組流來加載檔案
//尋找.properties檔案路徑方式一
//從當前專案的根目錄下尋找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");
//加載位元組流
properties.load(inputStream);
System.out.println("properties="+properties);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在一個普通的Java專案中,如果我們想讀取.properties組態檔,可以有兩種方式:
- 類名.class.getResource("組態檔路徑及名稱") :該方式會得到一個URL物件,它代表了組態檔的路徑;
- 類名.class.getResourceAsStream("組態檔路徑及名稱") :該方式會直接得到InputStream物件,
在上面的代碼中,我們讀取到了名為db.properties的組態檔,并將其存盤在一個Properties物件中,
2.2 讀取配置資訊
在上面的代碼中,我們從組態檔中讀取了三個鍵值對,分別是jdbc.url、jdbc.username和jdbc.password,在讀取組態檔后,接下來我們就可以通過getProperty()方法來獲取配置資訊了,如果組態檔中不存在這些鍵,getProperty()方法將會回傳null,
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
public class Demo23 {
public static void main(String[] args) {
//創建Properties物件
Properties properties = new Properties();
try {
//設定db.properties組態檔,利用位元組流來加載檔案
//尋找.properties檔案路徑方式一
//從當前專案的根目錄下尋找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");
//加載位元組流
properties.load(inputStream);
System.out.println("properties="+properties);
//從組態檔中根據指定的key來讀取配置資訊
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();
}
}
}
要注意,我們在呼叫 getProperty()方法 獲取配置資訊時,如果指定的key不存在,會回傳 null ,但我們可以提供一個默認值,這樣當key不存在時會回傳一個默認值, 并且如果有多個.properties檔案,可以反復呼叫load()讀取,后讀取的key-value會覆寫已讀取的key-value,
2.3 使用默認值讀取資訊
在讀取組態檔時,如果某個鍵不存在,getProperty()方法將回傳null,為了避免出現NullPointerException,我們可以為getProperty()方法指定一個默認值,例如:
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這個鍵,getProperty方法會回傳我們設定的默認值"jdbc:mysql://localhost:3306/mydb",
3. 寫入Properties檔案
接下來我們再通過一個案例,來學習如何把配置資訊寫入到Properties檔案里,
3.1 寫入組態檔
我們可以使用Properties類的store方法來寫入組態檔,例如:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Properties;
public class Demo24 {
public static void main(String[] args) {
//設定配置資訊
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");
// 加載位元組流
properties.load(inputStream);
System.out.println("properties=" + properties);
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上代碼中,將三個鍵值對寫入到了名為db.properties的組態檔中,并添加了一行注釋“Database connection properties”,
3.2 使用默認值寫入資訊
另外在Properties類中,其實本身就有一個默認的Properties物件,可以用來設定一些默認屬性值,我們可以使用Properties類的getDefaultProperties()方法來獲取默認的Properties物件,然后使用setProperty()方法來設定默認屬性值,例如:
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);
以上代碼中,我們先獲取了默認的Properties物件,然后設定了jdbc.url、jdbc.username和jdbc.password三個默認屬性值,接著,我們創建了一個新的Properties物件,并將默認的Properties物件傳遞給它,這樣,在讀取組態檔時,如果某個鍵不存在,getProperty方法就會先在當前Properties物件中查找,如果找不到,就會在默認Properties物件中查找,
四. 讀寫XML組態檔
其實Properties類不僅可以操作.properties組態檔,也可以操作.xml格式的檔案,接下來再給大家講一下如何操作xml檔案,
1. 創建XML檔案
首先我們來創建一個xml格式的組態檔,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 宣告一個properties屬性節點 -->
<!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">陳述句來宣告一個properties根結點,大家可以根據自己的需要定義自己的節點名稱,
2. 讀取XML組態檔
要想讀取XML格式的組態檔,可以使用loadFromXML()方法從XML檔案中讀取配置資訊,例如:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo25 {
public static void main(String[] args) {
// 創建Properties物件
Properties properties = new Properties();
try {
// 從當前專案的根目錄下尋找db.properties檔案
InputStream inputStream = Demo25.class.getResourceAsStream("/config.xml");
// 加載位元組流,從XML檔案中讀取配置資訊
properties.loadFromXML(inputStream);
// 從組態檔中根據指定的key來讀取配置資訊
// 讀取資訊時設定默認值
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組態檔,并將其存盤在一個Properties物件中,在讀取XML格式的組態檔后,我們就可以通過getProperty方法來獲取配置資訊了,
3. 寫入XML組態檔
同時,我們也可以使用storeToXML()方法,將Properties中的鍵值對資訊存盤到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;
public class Demo26 {
public static void main(String[] args) {
// 設定配置資訊
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");
// 加載位元組流
properties.loadFromXML(inputStream);
System.out.println("xml=" + properties);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在以上代碼中,我們將三個鍵值對寫入了一個名為config.xml的XML組態檔中,并添加了一行注釋“Database connection properties”,
五. 結語
在本文中,為大家詳細介紹了Java中的Properties配置類,它是用來處理組態檔的一個實用工具類,該類可以從檔案系統、classpath或其他任何地方讀取.properties檔案,我們在讀寫Properties時,注意僅使用getProperty()和setProperty()方法,不要呼叫繼承而來的get()和put()等方法,
通過本文的介紹,相信大家已經掌握了Properties類的基本用法,包括讀寫組態檔、設定默認值、讀寫XML格式的組態檔等等,在實際開發中,我們可以結合Properties類來實作程式的配置功能,提高程式的靈活性和可維護性,
六、配套視頻
視頻教程:戳這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553734.html
標籤:其他
上一篇:Python工具箱系列(三十四)
下一篇:返回列表
