2008-10-22 5 views
26

Estoy tratando de usar ResourceBundle#getStringArray para recuperar un String[] desde un archivo de propiedades. La descripción de este método en la documentación dice:¿Cómo especifico valores en un archivo de propiedades para que se puedan recuperar utilizando ResourceBundle # getStringArray?

Obtiene una matriz de cadenas para la clave dada de este paquete de recursos o uno de sus padres.

Sin embargo, he tratado de almacenar los valores en el archivo de propiedades como varios pares clave/valor individuales:

key=value1 
key=value2 
key=value3 

y como una lista separada por comas:

key=value1,value2,value3 

pero ninguno de estos es recuperable usando ResourceBundle#getStringArray.

¿Cómo se representa un conjunto de pares clave/valor en un archivo de propiedades para que se puedan recuperar usando ResourceBundle#getStringArray?

Respuesta

31

Un objeto puede contener PropertiesObject s, no sólo String s. Esto tiende a ser olvidado porque están acostumbrados mayoritariamente a la carga. archivos de propiedades, y tan a menudo solo contendrán String s. The documentation i indica que llamar al bundle.getStringArray(key) equivale a llamar al (String[]) bundle.getObject(key). Ese es el problema: el valor no es String[], es String.

Sugeriría almacenarlo en formato delimitado por comas y llamar al split() en el valor.

+1

Gracias, la respuesta que brindó es lo que sospechaba. Ya había implementado algo usando split(), solo esperaba poder aprovechar algo que ya estaba en la biblioteca de la clase, en lugar de hacer mi propia versión. –

+0

¡Gracias por la respuesta! Utilicé una división simple que recogió el espaciado que utilicé después de las comas (para facilitar la lectura). Tuve que usar una división más sofisticada como: http://stackoverflow.com/questions/1396084/regex-for-comma-delimited-list – ChrisCantrell

3

Umm, parece que este es un problema común, a partir de los hilos here y here.

Parece bien que no utilice el método y analizar el valor de una matriz usted mismo o escribir su propia implementación ResourceBundle y hágalo usted mismo :(. Tal vez hay un proyecto de apache commons para este ...

a partir del código fuente del JDK, parece que el PropertyResourceBundle no lo soporta.

+0

que había hecho algunas google también, pero ninguna de las respuestas parecían indicar específicamente que PropertyResourceBund le no es compatible con esto. Creo que vi un proyecto de Apache commons que proporciona un método getStringArray() para manejar key = value1, value2, value3, pero solo voy a lanzar el mío. Gracias. –

1

No creo que esto sea posible con ResourceBundles cargado desde un archivo de propiedades. PropertyResourceBundle aprovecha la clase Properties para cargar el archivo de propiedades. La clase Propiedades carga un archivo de propiedades como un conjunto de entradas String-> String map y no admite extraer valores String [].

Llamar a ResourceBundle.getStringArray simplemente llama a ResourceBundle.getObject, lanzando el resultado a String []. Dado que PropertyResourceBundle simplemente entrega esto a la instancia de Propiedades que cargó desde el archivo, nunca podrá hacer que funcione con el stock actual PropertyResourceBundle.

0
public String[] getPropertyStringArray(PropertyResourceBundle bundle, String keyPrefix) { 
    String[] result; 
    Enumeration<String> keys = bundle.getKeys(); 
    ArrayList<String> temp = new ArrayList<String>(); 

    for (Enumeration<String> e = keys; keys.hasMoreElements();) { 
     String key = e.nextElement(); 
     if (key.startsWith(keyPrefix)) { 
      temp.add(key); 
     } 
    } 
    result = new String[temp.size()]; 

    for (int i = 0; i < temp.size(); i++) { 
     result[i] = bundle.getString(temp.get(i)); 
    } 

    return result; 
} 
7

Puede utilizar Commons Configuration, que cuenta con métodos getList y getStringArray que le permiten recuperar una lista de cadenas separadas por comas.

+1

@JG: Gracias, consideraré la configuración de Commons en mi próximo proyecto. Me gusta que admita 'clave: valor1',' clave: valor2', 'clave: valor3' en varias líneas, así como una lista separada por comas (y la capacidad de escapar de las comas en el valor, que mi rollo-tu- propia versión no es compatible). –

+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

2

ejemplo:

[email protected], [email protected] 

..

myBundle=PropertyResourceBundle.getBundle("mailTemplates/bundle-name", _locale); 

..

public List<String> getCcEmailAddresses() 
{ 
    List<String> ccEmailAddresses=new ArrayList<String>(); 
    if(this.myBundle.containsKey("mail.ccEmailAddresses")) 
    { 
     ccEmailAddresses.addAll(Arrays.asList(this.template.getString("mail.ccEmailAddresses").split("\\s*(,|\\s)\\s*")));// 1)Zero or more whitespaces (\\s*) 2) comma, or whitespace (,|\\s) 3) Zero or more whitespaces (\\s*) 
    }  
    return ccEmailAddresses; 
} 
0

He intentado esto y no pude encontrar una manera. Una forma es definir una subclase de ListResourceBundle, a continuación, definir variable de instancia de tipo String [] y asignar el valor a la clave .. aquí está el código

@Override 
protected Object[][] getContents() { 
    // TODO Auto-generated method stub 

    String[] str1 = {"L1","L2"}; 

    return new Object[][]{ 

      {"name",str1}, 
      {"country","UK"}     
    }; 
} 
1
key=value1;value2;value3 

String[] toArray = rs.getString("key").split(";"); 
Cuestiones relacionadas