我們正在使用java.util.ResourceBundle
加載屬性信息內的資源包文件。我們的屬性文件已變得如此龐大,我們正在考慮主屬性文件分成幾個子模塊。是否有可能實現這一目標?是否有可能包括一個資源包
master.properties
==>
master.properties
include moduleA.properties
include moduleB.properties
讓我知道嗎?
我們正在使用java.util.ResourceBundle
加載屬性信息內的資源包文件。我們的屬性文件已變得如此龐大,我們正在考慮主屬性文件分成幾個子模塊。是否有可能實現這一目標?是否有可能包括一個資源包
master.properties
==>
master.properties
include moduleA.properties
include moduleB.properties
讓我知道嗎?
首先,我想知道你爲什麼選擇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");
可以編程,但是,建設資源包但你說你的文件是巨大的,如果那麼它加載到內存中。
更新
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
}
}
更多的精神食糧比測試的解決方案。
XML文件支持實體在分析過程中從其他文件內嵌文本。如果看到複雜的XML文件,這種技術已被用於模塊化文件。
Properties
現在支持兩種文件格式,即帶有鍵/值對和xml格式的常見.properties
格式。 Properties
可以加載和存儲/從XML文件。
ResourceBundle
有一個直接的子類:PropertyResourceBundle
。它看起來像這個類實際上限於舊的鍵/值對格式,但它可以用來實現另一個類,如XMLPropertyResourceBundle
,它能夠從XML文件讀取屬性,其中entity
技巧可以幫助模塊化這些文件。
如果這樣做 - 將現有屬性文件轉換爲xml屬性文件應該很容易,只需使用Properties
類,從標準格式讀取並存儲到XML。
更痛苦,使在一個文件中的所有的修改,這個問題是開發時間,而不是與運行 – Jason 2011-01-06 11:54:02