2013-07-26 15 views
8

So che posso creare una mappa come di seguito.Memorizzazione della mappa nel file delle proprietà

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

vorrei memorizzare i valori della mia mappa in un file di configurazione. Sto già la memorizzazione dei valori per un hashset diversa nel file di configurazione facendo values=value1,value2,value3 e poi
new HashSet<String>(Arrays.asList(prop.getProperty(values).split(",")))

mi piacerebbe fare qualcosa di simile per la mia mappa. Qualche consiglio? Sto usando java.util.Properties

+0

Immagino che tu non voglia aggiungere la mappa mettendo ogni coppia chiave/valore dalla tua mappa in 'Proprietà' (tramite' properties.putAll (WordMap) ') - invece provi a mettere l'intera mappa come valore singolo nelle proprietà? – zapl

risposta

17

Dal momento che hai indicato non si desidera utilizzare JSON, è possibile memorizzare la mappa come singola proprietà come questa:

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

Usa Guava's Splitter and Joiner per semplificare la lettura e la scrittura la mappa:

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

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

Ciò funzionerà finché le chiavi e i valori non contengono caratteri "," o "=".

+0

grazie! quindi potrei semplicemente ottenere la proprietà, chiamare parseMap e impostarla uguale alla mia mappa – Lemonio

+0

ci sarebbe un modo efficace per eseguire la seconda affermazione con un ordine inverso? se voglio un valore -> mappa chiave pure e non voglio passare attraverso l'intera cosa e ricrearne una nuova o memorizzare una seconda configurazione nel file delle proprietà – Lemonio

+0

@Lemonio guarda BiMap di Guava: http: // docs. guava-libraries.googlecode.com/git/javadoc/com/google/common/raccogliere/BiMap.html – dnault

1

java.util.Properties utilizza internamente hashtable per la memorizzazione delle coppie di valori chiave menzionate nel file delle proprietà. Puoi farne pieno uso per il tuo scopo.

+0

@SotiriosDelimanolis si è corretto. Grazie! –

+0

Si potrebbe desiderare di cambiare anche che non _use internamente_. Capisco che abbia una variabile di istanza. In realtà "estende Hashtable". Potrebbe confondere gli altri. –

+0

@ Zim-ZamO'Pootertoot public classe Properties estende Hashtable

2

Formattare il contenuto della Mappa come una stringa. Usa un formato standard come JSON. Con la biblioteca json-smart questo sarebbe un aspetto simile:

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

Per analizzare la mappa:

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

OK, grazie! la mappa deve essere creata con quel codice? è proprietà più di un semplice file di testo? perché l'idea era che le persone sarebbero state in grado di configurare il contenuto della mappa all'interno del file di testo, se hanno bisogno di eseguire il codice per farlo non ha senso includerlo in quanto potrebbero anche cambiare le dichiarazioni put nel codice – Lemonio

+1

L'idea dietro questa risposta era che se si desidera memorizzare la mappa di parole in una singola proprietà, è necessario formattarla come stringa. JSON è un formato standard con un buon supporto per le librerie, ma poiché si intende che gli utenti finali possano modificare il file delle proprietà, JSON probabilmente non è la scelta migliore. Usa semplicemente il formato che ritieni sia più semplice per i tuoi utenti e scrivi codice personalizzato per formattarlo e analizzarlo. map = key1 = value1, key2 = value2, key3 = value4 funzionerebbe bene, a condizione che le tue chiavi e valori non possano contenere mai caratteri "=" o ",". – dnault

+0

Dopo aver postato questa risposta, Jackson è diventato la mia libreria preferita per la serializzazione e l'associazione dei dati JSON. – dnault