することができるリソースバンドルのファイル内のリソースバンドル
-
26-09-2019 - |
質問
を用いて 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
代表取commaseparated文字列のベースの名前のモジュールのプロパティファイル:
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");
他のヒント
できprogramaticallyしかし、構築ResourceBundleです"というファイルは巨大なそうであれば読み込まれます。
更新
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
は現在、2つのファイル形式、キー/値のペアと共通.properties
フォーマットとXMLフォーマットをサポートしています。 Properties
は、XMLファイルから/にロードして保存することができます。
ResourceBundle
: PropertyResourceBundle
は1つの直接のサブクラスを持っています。それは、このクラスのように見え、実際に古いキー/値のペアの形式に限定されているが、XMLPropertyResourceBundle
トリックは、それらのファイルをモジュール化するのに役立つ可能性があり、XMLファイルからプロパティを読み取ることができるentity
のような別のクラスを実装するために使用することができます。
この作品の場合 - 。XMLプロパティファイルに既存のプロパティファイルを変換することは簡単なはずです、単にXMLを標準フォーマットとストアから読み、Properties
クラスを使用します。