2013-07-26 63 views
8

我知道我可以建立一個如下圖。在屬性文件中存儲地圖

private static final ImmutableMap<String,String> WordMap = 
ImmutableMap.<String, String>builder() 
.put("blah", "blahblah").put("blabla", "blahblahblah").build() 

我想將我的地圖的值存儲在配置文件中。 我已經做 values=value1,value2,value3存儲在配置文件中不同的HashSet的值,然後
new HashSet<String>(Arrays.asList(prop.getProperty(values).split(",")))

我想做我的地圖類似的東西。 任何提示? 我正在使用java.util.Properties

+0

我想你不想通過把你的地圖中的每個鍵/值對放在'Properties'(通過'properties.putAll(WordMap)')來添加地圖 - 而是嘗試把整個地圖作爲一個單個值進入屬性? – zapl

回答

17

既然你已經表明你不想使用JSON,你可以存儲地圖作爲單個屬性是這樣的:

map=key1=value1,key2=value2,key3=value3 

使用Guava's Splitter and Joiner簡化讀取和寫入地圖:

String formatMap(Map<String, String> map) { 
    return Joiner.on(",").withKeyValueSeparator("=").join(map); 
} 

Map<String, String> parseMap(String formattedMap) { 
    return Splitter.on(",").withKeyValueSeparator("=").split(formattedMap); 
} 

只要鍵和值不包含「,」或「=」字符,這將工作。

+0

謝謝!所以我可以只是得到屬性,調用parseMap並將其設置爲等於我的地圖 – Lemonio

+0

會有一種有效的方式來做第二個語句的逆序嗎?如果我想要一個值 - >關鍵地圖,並且不想通過整個事情並重新創建一個新的或在屬性文件中存儲第二個配置 – Lemonio

+0

@Lemonio查看Guava的BiMap:http:// docs。番石榴libraries.googlecode。COM/git的/的Javadoc/COM /谷歌/普通/收集/ BiMap.html – dnault

1

java.util.Properties內部使用散列表存儲屬性文件中提到的鍵值對。你可以充分利用它來達到你的目的。

+0

@SotiriosDelimanolis耶糾正。謝謝! –

+0

您可能還想改變它不會使用_內部_。我明白,因爲它有一個實例變量。它實際上'擴展了Hashtable'。它可能會混淆他人。 –

+0

@ Zim-ZamO'Pootertoot public class Properties擴展Hashtable

2

將Map的內容格式化爲字符串。使用像JSON這樣的標準格式。隨着json-smart庫,這將是這個樣子:

JSONObject json = new JSONObject(); 
json.putAll(WordMap); 
String serializedMap = json.toString(); 
prop.setProperty("wordMap", serializedMap); 

爲了解析圖:

String serializedMap = prop.getProperty("wordMap"); 
JSONObject json = (JSONObject) JSONValue.parse(serializedMap); 
Map<String, String> wordMap = new HashMap<>(); 

for (Map.Entry<String,Object> entry : json.entrySet()) { 
    wordMap.put(entry.getKey(), (String) entry.getValue()); 
} 
+0

好的,謝謝!該地圖是否必須使用該代碼創建?屬性不僅僅是一個文本文件?因爲這個想法是人們能夠在文本文件中配置地圖的內容,如果他們需要運行代碼來完成它,沒有必要包含它,因爲它們可能會改變代碼中的put語句 – Lemonio

+1

這個想法這個答案的後面是,如果你想在單個屬性中存儲單詞映射,你需要將它格式化爲一個字符串。 JSON是一種具有良好庫支持的標準格式,但由於您打算讓最終用戶編輯屬性文件,因此JSON可能不是最佳選擇。只需使用您認爲最簡單的格式即可,並編寫自定義代碼進行格式化和解析。只要你的鍵和值不能包含「=」或「,」字符,map = key1 = value1,key2 = value2,key3 = value4就可以正常工作。 – dnault

+0

發佈此答案後,Jackson已成爲JSON [de]序列化和數據綁定的首選庫。 – dnault

相關問題