詳談Java中Properties配置類怎麼用

来源:https://www.cnblogs.com/qian-fen/archive/2023/05/29/17440173.html
-Advertisement-
Play Games

本文將為大家詳細講解Java中Properties配置類怎麼用,這是我們進行開發時經常用到的知識點,也是大家在學習Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題!文章較長,乾貨滿滿,建議大家收藏慢慢學習。文末有本文重點總結,主頁有全系列文章分享。技術類問題,歡迎大家和我們一起交流討... ...


本文將為大家詳細講解Java中Properties配置類怎麼用,這是我們進行開發時經常用到的知識點,也是大家在學習Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題!

文章較長,乾貨滿滿,建議大家收藏慢慢學習。文末有本文重點總結,主頁有全系列文章分享。技術類問題,歡迎大家和我們一起交流討論!

前言

在前面的幾篇文章中,給大家講解了Java里的List、Set和Map等集合

所以現在我們知道,Map集合作為一個雙列集合,有keyvalue兩個值,這兩個值共同組成了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類讀取配置文件的信息,一般要經歷如下三步:

  1. 創建 Properties 實例;
  2. 調用 load()方法 讀取配置文件;
  3. 調用 getProperty()方法 獲取具體的配置信息。

瞭解了以上這些內容之後,接下來,會通過幾個例子來給大家詳細地介紹Properties的使用方法。

二. 讀寫Properties配置文件

首先我們通過一個案例,來學習如何讀取Properties配置文件里的信息。

1. 創建Properties文件

為了方便測試,我們可以先在項目中創建一個.properties的配置文件。這裡就把該配置文件命名為db.properties了,如下圖所示:

image.png

大家要註意,在早期的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配置文件,可以有兩種方式:

  1. 類名.class.getResource("配置文件路徑及名稱") :該方式會得到一個URL對象,它代表了配置文件的路徑;
  2. 類名.class.getResourceAsStream("配置文件路徑及名稱") :該方式會直接得到InputStream對象。

在上面的代碼中,我們讀取到了名為db.properties的配置文件,並將其存儲在一個Properties對象中。

2.2 讀取配置信息

在上面的代碼中,我們從配置文件中讀取了三個鍵值對,分別是jdbc.url、jdbc.usernamejdbc.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.usernamejdbc.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類來實現程式的配置功能,提高程式的靈活性和可維護性。

六、配套視頻

視頻教程:戳這裡


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 聊一下MySQL 關於mysql關係型資料庫的一些分析: 1、從性能上:如果我們碰到需要執行耗時特別久,並且執行結果不是很頻繁變動的SQL語句,我們就沒有必要每次都去查詢資料庫,因為每次操作資料庫都很耗時。 2、從併發上:在大併發的情況下(比如618秒殺活動,你敢讓千萬級的請求直接打到資料庫上 ...
  • 歡迎來到系列第八篇,異常處理的深入探討。本文將分五部分展開。首先,我們將學習Python異常處理的基礎知識,理解`try/except`語句的用法。然後,我們將瞭解Python的常見異常類型並通過實例理解它們的作用。第三部分,我們將更深入地解析`try-except`塊,理解其工作原理及更加複雜的用... ...
  • 哈嘍大家好,我是鹹魚 相信小伙伴們在學習 python 數據分析的過程中或多或少都會聽說或者使用過 pandas pandas 是 python 的一個拓展庫,常用於數據分析 今天鹹魚將介紹幾個關於 pandas 導入數據的方法和技巧 ## 從 URL 獲取 csv 數據 關於 pandas 導入 ...
  • ## 教程簡介 Angular Highcharts是一個基於Angular的開源組件,可在Angular應用程式中提供優雅且功能豐富的高圖表可視化,並可與Angular組件無縫配合使用。 [Angular Highcharts入門教程](https://www.itbaoku.cn/tutoria ...
  • ## 教程簡介 Flume是Apache下麵的一個分散式組件,它提供高效,可靠的收集,整合,傳輸日誌數據的服務。Flume可以理解成一個管道,它連接數據的生產者和消費者,它從數據的生產者(Source)獲取數據,保存在自己的緩存(Channel)中,然後通過Sink發送到消費者。它不對數據做保存和復 ...
  • ## 測試環境: > MySQL版本:8.0 資料庫表:T (主鍵id,唯一索引c,普通欄位d) ![](http://img.javastack.cn/1685072039483867.png) 如果你的業務設計依賴於自增主鍵的連續性,這個設計假設自增主鍵是連續的。但實際上,這樣的假設是錯的,因為 ...
  • 編碼如下:#include <stdio.h> void swap(int* x,int* y ){ int tmp; tmp=*x; *x=*y; *y=tmp ; }; int main(){ int a=4; int b=5; printf("befer\n"); printf("a=%d\n ...
  • @[TOC] # 1.背景 最近項目是國際項目,所以需要經常需要用到UTC時間和local時間的轉換。 所以整理了一下時間戳工具類,方便使用。 這裡主要用到的包就是datatime、time、pytz。 # 2. 遇到的坑 直接看測試案例 ```python tzinfo=pytz.timezone ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...