2012-04-16 16 views
15

È possibile impilare proprietà caricate in Java? Per esempio posso fare:Caricamento di più file di proprietà

e accedere alle proprietà da entrambi?

+1

Sì, se le proprietà hanno nomi diversi. No, se le proprietà hanno lo stesso nome. Se i nomi delle proprietà si scontrano, dovrai fornire tu stesso l'impilamento. – Jesse

risposta

28

Si può fare questo:

Properties properties = new Properties(); 

properties.load(new FileInputStream("file1.properties")); 

Properties properties2 = new Properties(); 
properties2.load(new FileInputStream("file2.properties")); 

properties.putAll(properties2); 
+5

Se file2.properties contiene proprietà con gli stessi nomi delle proprietà definite in file1.properties, saranno presenti solo i valori per tali proprietà in file2.properties. – Jesse

+0

Giusto. Non è possibile mantenere entrambe le proprietà alla volta, poiché le chiavi devono essere univoche. –

+0

Il metodo consigliato è di passare il file delle proprietà predefinito nel costruttore. That Properties extends Map è solo un dettaglio di implementazione. – Puce

8

Sì le proprietà stack. Properties estende Hashtable e load() chiama semplicemente put() su ogni coppia chiave-valore.

relativo codice dalla Source:

String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf); 
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf); 
put(key, value); 

In altre parole, il caricamento da un file non cancella le voci correnti. Tuttavia, si noti che se i due file contengono voci con la stessa chiave, il primo verrà sovrascritto.

+0

Il metodo consigliato è di passare il file delle proprietà predefinito nel costruttore. That Properties extends Map è solo un dettaglio di implementazione. – Puce

+1

Questo comportamento non è dichiarato dal contratto 'Proprietà' (in altre parole, questo non è documentato con tutte le possibili conseguenze dell'uso di funzionalità non documentate). –

+0

Questo è vero e dovrebbe essere preso in considerazione. Ero semplicemente interessato ai risultati reali piuttosto che al comportamento documentato. – tskuzzy

3

In realtà, sì. Puoi farlo. Se una qualsiasi delle proprietà si sovrappone, la nuova proprietà caricata avrà luogo in quella più vecchia.

2

Sì, è necessario passare il file delle proprietà predefinito nel costruttore. In questo modo puoi incatenarli.

Es .:

Properties properties1 = new Properties(); 
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file1.properties"))){ 
    properties1.load(bis); 
} 

Properties properties2 = new Properties(properties1); 
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file2.properties"))){ 
    properties2.load(bis); 
} 
+0

All'inizio mi è piaciuto, ma ora ho delle riserve. Mettendo da parte l'uso di BufferedInputStream, com'è migliore del codice dell'OP? In entrambi i casi, si sta caricando il secondo file direttamente in un oggetto Proprietà che contiene le proprietà del primo file. Ma in questo esempio, stai creando un nuovo oggetto proprietà. Qual è il vantaggio? – datguy

+0

Se si utilizza questo metodo e si sta iterando sopra le proprietà per qualche motivo, è ** necessario ** utilizzare 'propertyNames()' o 'stringPropertyNames()' per ottenere l'elenco su iterare. Se usi i metodi 'Map' sottostanti come' entrySet() 'o' keySet() ', le proprietà specificate nel costruttore non saranno incluse. –

1

Questo dovrebbe anche funzionare. Se la stessa proprietà è definita in file1.properties e file2.properties, la proprietà in file2.properties sarà effettiva.

Properties properties = new Properties(); 
    properties.load(new FileInputStream("file1.properties")); 
    properties.load(new FileInputStream("file2.properties")); 

Ora la mappa delle proprietà avrà le proprietà di entrambi i file. Se la stessa chiave appare in file1 e file2, il valore della chiave da file1 verrà aggiornato nelle proprietà con valore in file2 poiché sto chiamando file1 quindi file2.

1

È possibile farlo un po 'più dinamico, lavorando con un numero indeterminato di file.

Il parametro per questo metodo deve essere un elenco con il percorso del file delle proprietà. Ho reso il metodo statico, lo ho messo in una classe con altre funzioni correlate alla gestione dei messaggi e lo ho semplicemente richiamato quando ne ho bisogno:

public static Properties loadPropertiesFiles(LinkedList<String> files) { 
    try { 
     Properties properties = new Properties(); 

       for(String f:files) { 
        Resource resource = new ClassPathResource(f); 
        Properties tempProp = PropertiesLoaderUtils.loadProperties(resource); 
        properties.putAll(tempProp); 
       } 
       return properties; 
    } 
    catch(IOException ioe) { 
       return new Properties(); 
    } 
} 
Problemi correlati