2008-10-22 10 views
26

Bir özellik dosyasından String[] almak için ResourceBundle#getStringArray kullanmayı deniyorum. Belgelerindeki bu yöntemin açıklaması:Özellikler dosyasında, ResourceBundle # getStringArray kullanılarak alınabilecek değerleri nasıl belirtebilirim?

Bu kaynak paketinden veya ebeveynlerinden biri için verilen anahtar için bir dize dizisi döndürür.

Ancak, özelliklerini değerleri olarak ayrı ayrı çok sayıda anahtar/değer çiftlerini dosyasını depolamak için çalışmışlardır:

key=value1 
key=value2 
key=value3 

ve virgülle ayrılmış liste olarak:

key=value1,value2,value3 

ancak Bunlardan hiçbiri ResourceBundle#getStringArray kullanılarak alınamaz.

Bir özellik dosyasındaki bir anahtar/değer çiftleri kümesini, ResourceBundle#getStringArray kullanılarak alınabilecek şekilde nasıl temsil ediyorsunuz?

cevap

31

A Properties nesne Object s, sadece String s tutabilir. onlar ezici yüklemek için kullanılacağından, bu unutulmaya eğilimindedir. özellikleri dosyaları ve çoğu zaman sadece String s içerir. The documentation i bundle.getStringArray(key) numaralı telefonu arayarak (String[]) bundle.getObject(key) numaralı telefonu aramaya eşdeğerdir. Sorun şu: değer String[] değil, String.

Virgülle ayrılmış biçimde saklamayı ve split() değerini çağırmayı öneririm.

+1

Teşekkürler, sağladığınız cevap şüphelendiğim şey. Zaten split() kullanarak bir şey uyguluyorum, sadece sınıf kütüphanesinde bulunan bir şeyi kendi başıma yuvarlamak yerine kullanabileceğimi umuyordum. –

+0

Cevabınız için teşekkürler! Virgüllerden sonra kullandığım boşlukları (okunabilirlik için) toplayan basit bir bölme kullandım. Daha karmaşık bir bölme kullanmak zorunda kaldım: http://stackoverflow.com/questions/1396084/regex-for-comma-delimited-list – ChrisCantrell

3

Umm, bu, iş parçacığı here ve here'dan sık karşılaşılan bir sorundur.

Ya görünüyor size yöntemi kullanmak ve bir dizi için kendinizi değeri ayrıştırmak veya kendi ResourceBundle uygulama yazmak ve bunu kendin :(yapmayın. Belki ...

bunun için bir apache commons projesi var JDK kaynak kodu itibaren

, PropertyResourceBundle bunu desteklemez görünüyor.

+0

ama cevapların hiçbiri özellikle PropertyResourceBund belirtmek gibiydi le bunu desteklemiyor. Ben anahtar = value1, value2, value3 işlemek için bir getStringArray() yöntemi sağlayan bir apache commons projesi gördüm, ama ben sadece kendi rulo. Teşekkürler. –

1

Bunun bir özellik dosyasından yüklenen ResourceBundles ile mümkün olduğuna inanmıyorum. PropertyResourceBundle, özellikler dosyasını yüklemek için Özellikler sınıfını kullanır. Özellikler sınıfı, bir özellikler dosyasını String-> String eşleme girdileri olarak yükler ve String [] değerlerini çekmeyi desteklemez.

ResourceBundle.getStringArray öğesinin çağrılması sonucu ResourceBundle.getObject çağrılarak sonucu bir String [] dizinine gönderir. PropertyResourceBundle bunu dosyadan yüklenen Özellikler örneğine teslim ettiğinden, bunu hiçbir zaman geçerli olan hisse senedi PropertyResourceBundle ile çalışmaya başlayamazsınız.

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

Sen yöntemleri getList ve virgülle ayrılmış dizeleri listesini almak için izin getStringArray olan, Commons Configuration kullanabilirsiniz.

+1

@JG: Teşekkürler, bir sonraki projemde Commons Configuration'ı düşüneceğim. Ben şunu seviyorum: key: value1', 'key: value2',' key: value3' gibi birden fazla satırda virgülle ayrılmış bir liste (ve değerdeki virgüllerden kaçma yeteneği, benim roll-your- kendi sürümü desteklemiyor). –

+0

Bu özellik yalnızca özellik dosyaları için çalışıyor mu, yoksa Java "-D" komut satırı özellik parametreleri için de kullanılabilir mi? – David

2

örnek:

[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

Bunu denedim ve bir yol bulabiliriz. bir yolu burada .., ListresourceBundle bir alt sınıfını tanımlamak ve [] türü String örnek değişkeni tanımlamak ve anahtar değeri atamak için

@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(";"); 
İlgili konular