2009-09-16 21 views
34

Parece que java.util.Properties asume un valor por clave propery. Es decir,Múltiples valores en java.util.Properties

foo=1 
foo=2 

No es de esperar,

¿Existe una clase de este tipo de hoja de propiedades de varios valores, que también proporciona el método de carga?

+0

posible duplicado de [¿Cómo especifico los valores en un archivo de propiedades para que se puedan recuperar usando ResourceBundle # getStringArray?] (Http://stackoverflow.com/questions/226050/how-do-i-specify-values- in-a-properties-file-so-they-can-be-retrieved-using-reso) –

Respuesta

60

Probar:

foo=1,2 

String[] foos = properties.getProperty("foo").split(","); 
+1

Simple y elegante, ¡gracias! – ClueMinus

+10

La línea anterior lanzará una NullPointerException si la propiedad foo no se encuentra. Así que asegúrese de verificar que la propiedad exista o atrapar/lanzar la excepción si la propiedad es requerida. Si la propiedad es opcional, properties.getProperty ("foo", "") .split (",") podría ser una alternativa más segura. –

+2

@ lee-theobald: haga que su clase de propiedades sea una clase Groovy y puede hacer esto: 'String [] foos = properties.getProperty (" foo ") ?.split (",") 'y foo serán nulos en lugar de obtener un NPE :) – rjohnston

20

La función java.util.Properties es bastante limitada. Si quieres apoyar la lista, es posible que desee probar PropertyConfiguration de configuración de Apache Commons,

http://commons.apache.org/configuration/userguide/howto_properties.html#Using_PropertiesConfiguration

Con ella, se puede establecer ningún delimitador a su lista y éste se parte de forma automática. También puede hacer otras cosas elegantes en el archivo de propiedades. Por ejemplo,

foo=item1, item2 
bar=${foo}, item3 
number=123 

se puede recuperar de esta manera,

Configuration config = new PropertiesConfiguration("your.properties"); 
String[] items = config.getStringArray("bar"); // return {"item1", "item2", "item3"} 
int number = config.getInt("number", 456); // 456 is default value 
+0

¿Funciona esto solo para los archivos de propiedades o podría funcionar para los parámetros de propiedad de la línea de comandos "-D" de Java? – David

4

respuesta correcta por Nick.

O, si se puede dar una subnombre diferente a cada valor, usted podría tener sus propiedades sean:

my.properties 

    foo.title=Foo 
    foo.description=This a big fat foo. 
+1

Pero usando este enfoque, ¿cómo tomarías todas las propiedades principales de foo, en una lista/matriz/colección de foo? Y ya que ha mostrado como nombres secundarios, uno pensaría que nos gustaría tomar la propiedad una vez como un objeto raíz y luego iterar a través de los subnombres por el nombre como clave para obtener su valor. Esa es la parte más difícil. Solo acceder a ellos como propiedades individuales es simple, pero la mayoría de la gente no busca hacerlo de esa manera para propiedades de múltiples valores. – David

0

Si tienes un ejemplo más complejo que podría utilizar el siguiente:

# pairs of properties 
source1=foo 
target1=bar 
source2=anotherFoo 
target2=regardingBar 
source3= ... 

En su código, tendrá que buscar:

Map<String, String> myMap = new HashMap<>(); 
for (int i=1; i<max; i++) { 
    String source = properties.get("source" + i); 
    String target = properties.get("target" + i); 
    if (source == null || target == null) { 
    break; 
    } 
    myMap.put(source, target); 
} 

Desventaja: actualizar el archivo de propiedades. Si elimina los valores * 2, no se agregarán todos los siguientes valores. Para mejorar, es posible que desee reemplazar la ruptura con un continuar y mantener un máximo de pares permitidos.

Cuestiones relacionadas