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
、最善の策は、ResourceBundle
カスタムによってロードを制御するカスタムを作成することですControl
。
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");
ただし、プログラムで ResourceBundle を構築することはできますが、ファイルが巨大であると言っているように、メモリにロードされるとどうなりますか。
アップデート
public class Resource extends java.util.ResourceBundle {
public Object handleGetObject(String key) {
//code
}
public Enumeration getKeys() {
//code
}
}
次に IN ロケールの場合
import java.util.*;
public class Resource_en_IN extends Resource{
public Object handleGetObject(String key) {
//code
}
}
テスト済みのソリューションよりも検討の余地があります。
XML ファイルは、解析中に他のファイルからのテキストをインライン化するためのエンティティをサポートしています。複雑な xml ファイルが見られる場合は、この手法を使用してファイルをモジュール化しています。
Properties
.properties
は、キーと値のペアを使用する一般的な形式と xml 形式の 2 つのファイル形式をサポートするようになりました。Properties
xml ファイルを読み込んだり、xml ファイルから保存したりできます。
ResourceBundle
1 つの直接サブクラスがあります: PropertyResourceBundle
. このクラスは実際には古いキーと値のペア形式に限定されているように見えますが、別のクラスを実装するために使用できます。XMLPropertyResourceBundle
たとえば、xml ファイルからプロパティを読み取ることができるクラスで、entity
トリックがそれらのファイルをモジュール化するのに役立ちます。
これが機能する場合、既存のプロパティ ファイルを xml プロパティ ファイルに変換するのは簡単です。Properties
クラスを使用し、標準形式から読み取って XML に保存するだけです。