[英]How to merge two java.util.Properties objects?
我正在嘗試在我的類中使用默認的java.util.Properties
對象,使用它接受的默認屬性,並讓開發人員通過指定另一個java.util.Properties
對象來覆蓋其中一些對象,但我找不到這樣做的好方法。
預期用途如下:
Properties defaultProperties = new Properties();
defaultProperties.put("key1", "value1");
defaultProperties.put("key2", "value2");
Properties otherProperties = new Properties();
otherProperties.put("key2", "value3");
Properties finalProperties = new Properties(defaultProperties);
//
// I'd expect to have something like:
//
// finalProperties.merge(otherProperties);
//
java.util.Properties
實現java.util.Map
接口,因此你可以這樣處理它,並使用像putAll
這樣的方法來添加另一個Map
的內容。
但是,如果您將其視為地圖,則需要非常小心:
new Properties(defaultProperties);
這通常會讓人們失望,因為它看起來像一個復制構造函數,但事實並非如此。 如果你使用那個構造函數,然后調用類似keySet()
(繼承自它的Hashtable
超類)的東西,你將得到一個空集,因為Properties
的Map
方法沒有考慮你傳遞給它的默認Properties
對象。構造函數。 只有在使用Properties
本身定義的方法時才會識別默認值,例如getProperty
和propertyNames
等。
因此,如果您需要合並兩個Properties對象,則執行此操作會更安全:
Properties merged = new Properties();
merged.putAll(properties1);
merged.putAll(properties2);
這將為您提供更可預測的結果,而不是任意將其中一個標記為“默認”屬性集。
通常情況下,我建議不要將Properties
視為Map
,因為那是(在我看來)Java早期的一個實現錯誤(屬性應該包含一個Hashtable
,而不是擴展它 - 這是懶惰的設計),但是貧血在Properties
定義的接口並沒有給我們很多選擇。
假設您最終想從文件中讀取屬性,我會在同一個屬性對象中加載兩個文件,如:
Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("default.properties"));
properties.load(getClass().getResourceAsStream("custom.properties"));
你幾乎是好的:
Properties defaultProperties = new Properties();
defaultProperties.setProperty("key1", "value1");
defaultProperties.setProperty("key2", "value2");
Properties finalProperties = new Properties(defaultProperties);
finalProperties.setProperty("key2", "value3");
編輯:由setProperty
替換put
。
是的,你只是調用putAll方法,你就完成了。
putAll():將指定映射中的所有映射復制到此哈希表。 這些映射將替換此哈希表對當前在指定映射中的任何鍵所具有的任何映射。
Properties merged = new Properties();
merged.putAll(properties1);
merged.putAll(properties2);
第2行完全沒有效果。 第一個文件中的所有屬性都不在合並的屬性對象中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.