2012-04-16 27 views
15

¿Es posible apilar propiedades cargadas en Java? Por ejemplo, ¿puedo hacer lo siguiente:Cargando múltiples archivos de propiedades

Properties properties = new Properties(); 

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

y acceder a las propiedades de ambos?

+1

Sí, si las propiedades tienen diferentes nombres. No, si las propiedades tienen los mismos nombres. Si los nombres de las propiedades chocan, deberá proporcionar el apilamiento usted mismo. – Jesse

Respuesta

28

Usted puede hacer esto:

Properties properties = new Properties(); 

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

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

properties.putAll(properties2); 
+5

Si file2.properties contiene propiedades con los mismos nombres que las propiedades definidas en file1.properties, solo estarán presentes los valores para esas propiedades en file2.properties. – Jesse

+0

Derecha. No puede mantener ambas propiedades a la vez, ya que las claves deben ser únicas. –

+0

La forma recomendada es pasar el archivo de propiedades predeterminado en el constructor. That Properties extends Map es solo un detalle de implementación. – Puce

8

Si las propiedades pila. Properties extiende Hashtable y load() simplemente llama a put() en cada par de clave-valor.

código pertinente de la Source:

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

En otras palabras, se carga de un archivo no borra las entradas actuales. Sin embargo, tenga en cuenta que si los dos archivos contienen entradas con la misma clave, se sobrescribirá la primera.

+0

La forma recomendada es pasar el archivo de propiedades predeterminado en el constructor. That Properties extends Map es solo un detalle de implementación. – Puce

+1

Este comportamiento no está declarado por el contrato 'Propiedades' (en otras palabras, esto no está documentado con todas las consecuencias posibles del uso de características no documentadas). –

+0

Esto es cierto y debe tenerse en cuenta. Simplemente estaba interesado en los resultados reales en lugar del comportamiento documentado. – tskuzzy

3

En realidad, sí. Puedes hacerlo. Si alguna de las propiedades se superpone, la propiedad cargada más nueva se reemplazará con la anterior.

2

Sí, debe pasar el archivo de propiedades predeterminado en el constructor. Así puedes encadenarlos.

ej .:

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

Me gustó esto al principio, pero ahora tengo reservas. Dejando de lado el uso de BufferedInputStream, ¿cómo es esto mejor que el código de OP? En ambos casos, está cargando el segundo archivo directamente en un objeto de Propiedades que contiene las propiedades del primer archivo. Pero en este ejemplo, está creando un nuevo objeto de propiedad. ¿Cuál es el beneficio? – datguy

+0

Si utiliza este método y está iterando sobre las propiedades por alguna razón, ** debe ** usar 'propertyNames()' o 'stringPropertyNames()' para obtener la lista para iterar. Si utiliza los métodos 'Map' subyacentes como' entrySet() 'o' keySet() ', las propiedades especificadas en el constructor no se incluirán. –

1

Esto también debería funcionar. Si la misma propiedad se define en file1.properties y file2.properties, la propiedad en file2.properties estará vigente.

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

Ahora el mapa de propiedades tendrá propiedades de ambos archivos. Si la misma clave aparece en el archivo1 y el archivo2, el valor de la clave del archivo1 se actualizará en las propiedades con valor en el archivo2, ya que invoco el archivo1 y luego el archivo2.

1

Puede hacer esto un poco más dinámico, trabajando con un número indeterminado de archivos.

El parámetro para este método debe ser una lista con la ruta al archivo de propiedades. Hice el método estático, lo puse en una clase con otras funciones relacionadas con el manejo de mensajes, y simplemente lo llamo cuando lo necesito:

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(); 
    } 
} 
Cuestiones relacionadas