2008-10-22 13 views
26

Ich versuche ResourceBundle#getStringArray zu verwenden, um eine String[] aus einer Eigenschaftendatei abzurufen. Die Beschreibung dieser Methode in der Dokumentation lautet:Wie gebe ich Werte in einer Eigenschaftendatei an, damit sie mit ResourceBundle # getStringArray abgerufen werden können?

Ruft ein Zeichenfolgenarray für den angegebenen Schlüssel aus diesem Ressourcenpaket oder einem seiner übergeordneten Elemente ab.

Ich habe jedoch die Werte der Eigenschaften-Datei als mehrere einzelne Schlüssel/Wert-Paare zu speichern versucht:

key=value1 
key=value2 
key=value3 

und als kommagetrennte Liste:

key=value1,value2,value3 

aber keiner von diesen ist abrufbar unter Verwendung ResourceBundle#getStringArray.

Wie stellen Sie eine Gruppe von Schlüssel/Wert-Paaren in einer Eigenschaftendatei dar, sodass sie unter Verwendung von ResourceBundle#getStringArray abgerufen werden können?

Antwort

31

A Properties Objekt Object s halten kann, nicht nur String s. das neigt dazu, vergessen zu werden, weil sie überwiegend verwendet zu laden sind. Eigenschaftendateien, und so oft nur String s enthalten. The documentation i gibt an, dass der Aufruf bundle.getStringArray(key) dem Aufruf (String[]) bundle.getObject(key) entspricht. Das ist das Problem: Der Wert ist kein String[], es ist ein String.

Ich würde vorschlagen, es im kommagetrennten Format zu speichern und split() auf den Wert aufrufen.

+1

Danke, die Antwort, die du zur Verfügung gestellt hast, ist was ich vermutet habe. Ich hatte bereits etwas mit split() implementiert, ich hatte nur gehofft, dass ich etwas nutzen konnte, das bereits in der Klassenbibliothek war, anstatt mein eigenes zu rollen. –

+0

Danke für die Antwort! Ich benutzte eine einfache Aufteilung, die den Abstand, den ich nach den Kommas verwendet hatte (zur besseren Lesbarkeit). Ich musste eine ausgeklügeltere Aufteilung wie: http://stackoverflow.com/questions/1396084/regex-for-comma-de-limited-list – ChrisCantrell

3

Umm, sieht so aus, ist dies ein häufiges Problem, von den Threads here und here.

Es scheint, entweder Sie nicht über die Methode und den Wert für ein Array selbst analysieren oder schreiben Sie Ihre eigene Resource Implementierung und do it yourself :(. Vielleicht gibt es ein Apache Commons Projekt für diesen ...

aus dem Quellcode JDK, so scheint es, die Property nicht unterstützt.

+0

ich auch einige googeln getan hatte, aber keine der Antworten schien ausdrücklich, dass PropertyResourceBund zu erklären, le unterstützt das nicht. Ich denke, ich sah ein Apache commons-Projekt, das eine getStringArray() -Methode zur Verfügung stellt, um key = value1, value2, value3 zu behandeln, aber ich werde nur meine eigenen rollen. Vielen Dank. –

1

Ich glaube nicht, dass dies mit ResourceBundles aus einer Eigenschaftendatei geladen möglich ist. Das PropertyResourceBundle nutzt die Properties-Klasse, um die Eigenschaftendatei zu laden. Die Properties-Klasse lädt eine Eigenschaftendatei als eine Gruppe von String-> String-Zuordnungseinträgen und unterstützt nicht das Ziehen von String [] - Werten.

Der Aufruf von ResourceBundle.getStringArray ruft ResourceBundle.getObject auf, wobei das Ergebnis in einen String [] umgewandelt wird. Da das PropertyResourceBundle diese Eigenschaft nur an die Properties-Instanz weitergibt, die es aus der Datei geladen hat, können Sie dies nie mit dem aktuellen, proprietären ResourceBundle-Bestand ausführen.

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

können Sie Commons Configuration verwenden, welche Methoden getList und getStringArray hat, mit denen Sie eine Liste mit Komma getrennt Strings abzurufen.

+1

@JG: Danke, ich werde Commons Konfiguration auf meinem nächsten Projekt berücksichtigen. Ich mag es, dass es 'key: value1',' key: value2', 'key: value3' in mehreren Zeilen sowie eine durch Kommas getrennte Liste unterstützt (und die Möglichkeit, Kommas in dem Wert zu entlehnen, was mein Roll-your- eigene Version wird nicht unterstützt). –

+0

Funktioniert das nur für Eigenschaftendateien, oder könnte das auch für die Befehlszeileneigenschaftsparameter "-D" von Java funktionieren? – David

2

Beispiel:

[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

Ich habe dies versucht und einen Weg finden könnte. Eine Möglichkeit ist es, eine Unterklasse von Listresourcebundle zu definieren, dann Instanz Variable vom Typ String [] und weisen Sie den Wert auf den Schlüssel definieren .. Hier ist der Code

@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(";"); 
Verwandte Themen