當我們開發 Java 應用程式時,通常需要使用一些配置,例如資料庫的 URL、伺服器的連接埠等。我們不想將這些設定直接硬編碼到程式碼中,而是從程式碼外部的某個位置(例如屬性檔)取得它們。或甚至能夠在運行時保存配置以便稍後讀取。
無論哪種情況,我們都可以針對某些場景制定自己的解決方案,例如創建一個文字檔案並在第一行保存資料庫的URL,在第二行保存伺服器連接埠等。但這可能很乏味且容易出錯,因此需要更強大且可擴展的解決方案。對於這種情況,Java 為我們提供了一個非常簡單且有效率的解決方案,即 Properties 類別。
Properties 是 java.util 套件中的一個類,它允許我們將配置暫時保存在記憶體中並永久保存在屬性檔案中,以便我們稍後可以讀取它們並在我們的應用程式中使用它們。透過建立 Properties 類別的實例,您將獲得一個行為類似於字典的對象,其中每個配置都保存為鍵值對。
首先,必須建立 Properties 類別的實例。
Properties props = new Properties();
透過繼承HashTable類別(它又繼承自Dictionary),在Properties類別中我們可以看到它有Object類型的方法,而實際上值應該是字串或String,而不是,每次使用值時都不需要強制轉換字串。這樣,雖然實例中存在地圖的常用方法,但大多數情況下沒有必要使用它們。例如,您可以使用 getProperty(String key),而不是使用 get(Object key)。
定義一個屬性,需要用到setProperty(String key, String value)方法,正如它的名字所示,這個方法接收兩個參數,key(你想如何呼叫屬性)和value(屬性值) ),考慮到兩個參數始終應為String 類型。
Properties props = new Properties(); props.setProperty("DB_HOST", "localhost"); props.setProperty("DB_PORT", "3306"); props.setProperty("DB_USER", "root"); props.setProperty("DB_PASS", "p4ssw0rd");
要取得屬性,可以使用 getProperty(String key) 方法,該方法接收要取得的屬性的鍵作為參數,如果屬性不存在,將傳回 null。
Properties props = new Properties();
為了避免在屬性不存在時取得 null,您可以使用 getProperty(String key, String defaultValue) 方法,該方法接收預設值作為第二個參數。
Properties props = new Properties(); props.setProperty("DB_HOST", "localhost"); props.setProperty("DB_PORT", "3306"); props.setProperty("DB_USER", "root"); props.setProperty("DB_PASS", "p4ssw0rd");
由於它是一個map類型的物件(雖然不建議使用HashTable方法),它有entrySet()方法,但是正如你所看到的,它是Object類型的,迭代所有屬性的替代方法是使用stringPropertyNames () 方法,此方法傳回一組包含所有屬性鍵的字串(傳回值不分先後)。
var API_URL = props.getProperty("API_URL"); System.out.println(API_URL); // Output null
顯示所有屬性的更快方法是使用 list(PrintStream out) 方法,該方法將所有屬性列印到作為參數傳遞的輸出流,例如 System.out。
var API_URL = props.getProperty("API_URL", "http://api.example.com"); System.out.println(API_URL); // Output http://api.example.com
Properties 提供了store() 和storeToXML() 方法,以便屬性可以以properties (key=value) 格式和XML 格式儲存(這可以是如果這些屬性將分別在不同的環境中使用,則很有用)。不要使用 save() 方法,因為它已過時,並且不建議使用它,因為它在發生錯誤時不會拋出異常。
在將屬性儲存到檔案之前,我們可以執行以下操作,透過控制台驗證使用 store() 和 System.out 方法實際儲存的內容,以某種方式控制拋出的例外非常重要。
for (String prop : props.stringPropertyNames()) { System.out.println(prop + " = " + props.getProperty(prop)); } // Output DB_PORT = 3306 DB_PASS = p4ssw0rd DB_USER = root DB_HOST = localhost
分析結果可以看到,第一行保存了作為第二個參數傳入的註解(是否為空字串沒關係,如果為null則不列印),在第二行保存保存屬性的日期和時間,從第三行開始,屬性以key=value.
格式儲存如果使用storeToXML()方法,將會得到一個包含以下內容的檔案:
props.list(System.out); // Output -- listing properties -- DB_PORT=3306 DB_PASS=p4ssw0rd DB_USER=root DB_HOST=localhost
要將屬性儲存在名為 db.properties 的檔案中,您可以執行以下操作:
props.store(System.out, "Database Configuration"); // Output #Database Configuration #Thu Oct 10 11:06:04 CST 2024 DB_HOST=localhost DB_PASS=p4ssw0rd DB_PORT=3306 DB_USER=root
執行後,如果沒有拋出異常,你會看到在程式執行的目錄下創建了一個名為 db.properties 的文件,內容如下:
props.storeToXML(System.out, "Database Configuration"); // Output <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>Database Configuration</comment> <entry key="DB_PORT">3306</entry> <entry key="DB_PASS">p4ssw0rd</entry> <entry key="DB_USER">root</entry> <entry key="DB_HOST">localhost</entry> </properties>
要將屬性儲存為 XML 格式,只需將 store() 方法變更為 storeToXML()。
Properties props = new Properties();
假設某些屬性已修改或在db.properties 或db.properties.xml 檔案中新增了新屬性,以從兩個檔案之一載入屬性,在properties 或XML,可以分別使用load()和loadFromXML()方法。以某種方式控制在文件不存在或無法讀取時引發的異常非常重要。
Properties props = new Properties(); props.setProperty("DB_HOST", "localhost"); props.setProperty("DB_PORT", "3306"); props.setProperty("DB_USER", "root"); props.setProperty("DB_PASS", "p4ssw0rd");
var API_URL = props.getProperty("API_URL"); System.out.println(API_URL); // Output null
var API_URL = props.getProperty("API_URL", "http://api.example.com"); System.out.println(API_URL); // Output http://api.example.com
以上是如何在Java中使用Properties類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!