2011-01-06 47 views
8

我們正在使用java.util.ResourceBundle加載屬性信息內的資源包文件。我們的屬性文件已變得如此龐大,我們正在考慮主屬性文件分成幾個子模塊。是否有可能實現這一目標?是否有可能包括一個資源包

master.properties 

==> 

master.properties 
    include moduleA.properties 
    include moduleB.properties 

讓我知道嗎?

回答

12

首先,我想知道你爲什麼選擇java.util.ResourceBundle而不是java.util.Properties。鑑於你的問題是如何制定,你似乎並不關心本地化/國際化,也不約束文件繼承。

Properties這是非常容易的,因爲它實現了Map,這反過來提供了putAll()方法來合併另一個地圖。開球例如:

Properties master = new Properties(); 
master.load(masterInput); 

Properties moduleA = new Properties(); 
moduleA.load(moduleAinput); 
master.putAll(moduleA); 

Properties moduleB = new Properties(); 
moduleB.load(moduleBinput); 
master.putAll(moduleB); 

// Now `master` contains the properties of all files. 

如果你真的堅持使用ResourceBundle,最好的辦法是,其中您可以通過自定義Control控逆變負載來創建自定義ResourceBundle

假設你已經在master.properties以下條目代表一個逗號分隔字符串模塊屬性文件的基本名稱:

include=moduleA,moduleB 

然後下面的自定義ResourceBundle例子應該工作:

public class MultiResourceBundle extends ResourceBundle { 

    protected static final Control CONTROL = new MultiResourceBundleControl(); 
    private Properties properties; 

    public MultiResourceBundle(String baseName) { 
     setParent(ResourceBundle.getBundle(baseName, CONTROL)); 
    } 

    protected MultiResourceBundle(Properties properties) { 
     this.properties = properties; 
    } 

    @Override 
    protected Object handleGetObject(String key) { 
     return properties != null ? properties.get(key) : parent.getObject(key); 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public Enumeration<String> getKeys() { 
     return properties != null ? (Enumeration<String>) properties.propertyNames() : parent.getKeys(); 
    } 

    protected static class MultiResourceBundleControl extends Control { 
     @Override 
     public ResourceBundle newBundle(
      String baseName, Locale locale, String format, ClassLoader loader, boolean reload) 
       throws IllegalAccessException, InstantiationException, IOException 
     { 
      Properties properties = load(baseName, loader); 
      String include = properties.getProperty("include"); 
      if (include != null) { 
       for (String includeBaseName : include.split("\\s*,\\s*")) { 
        properties.putAll(load(includeBaseName, loader)); 
       } 
      } 
      return new MultiResourceBundle(properties); 
     } 

     private Properties load(String baseName, ClassLoader loader) throws IOException { 
      Properties properties = new Properties(); 
      properties.load(loader.getResourceAsStream(baseName + ".properties")); 
      return properties; 
     } 
    } 

} 

(瑣碎的異常處理和本地化處理放在一邊,這取決於你)

這可以作爲:

ResourceBundle bundle = new MultiResourceBundle("master"); 
1

可以編程,但是,建設資源包但你說你的文件是巨大的,如果那麼它加載到內存中。

更新

public class Resource extends java.util.ResourceBundle { 



    public Object handleGetObject(String key) { 
     //code 
    } 

    public Enumeration getKeys() { 
     //code 
    } 
} 

然後在現場

import java.util.*; 

public class Resource_en_IN extends Resource{ 

    public Object handleGetObject(String key) { 
    //code 
    } 
} 
+0

更痛苦,使在一個文件中的所有的修改,這個問題是開發時間,而不是與運行 – Jason 2011-01-06 11:54:02

1

更多的精神食糧比測試的解決方案。

XML文件支持實體在分析過程中從其他文件內嵌文本。如果看到複雜的XML文件,這種技術已被用於模塊化文件。

Properties現在支持兩種文件格式,即帶有鍵/值對和xml格式的常見.properties格式。 Properties可以加載和存儲/從XML文件。

ResourceBundle有一個直接的子類:PropertyResourceBundle。它看起來像這個類實際上限於舊的鍵/值對格式,但它可以用來實現另一個類,如XMLPropertyResourceBundle,它能夠從XML文件讀取屬性,其中entity技巧可以幫助模塊化這些文件。

如果這樣做 - 將現有屬性文件轉換爲xml屬性文件應該很容易,只需使用Properties類,從標準格式讀取並存儲到XML。