7

java.util.ResourceBundleプロパティ情報の読み込みに使用しています。私たちのプロパティファイルは非常に大きくなり、マスタープロパティファイルをいくつかのサブモジュールに分割することを考えています。これを達成することは可能ですか?

master.properties

==> 

 master.properties
   include moduleA.properties
   include moduleB.properties

お知らせ下さい?

4

3 に答える 3

14

まず第一に、なぜあなたはを選んjava.util.ResourceBundleだのだろうかjava.util.Properties。質問がどのように定式化されているかを考えると、ローカリゼーション/国際化やバンドルファイルの継承については気にしていないようです。

別のマップをマージする方法を提供する実装を備えているため、非常にProperties簡単です。キックオフの例:MapputAll()

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");
于 2011-01-06T13:16:22.270 に答える
1

ただし、プログラムで 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
  }
}
于 2011-01-06T11:42:04.420 に答える
1

テスト済みのソリューションよりも検討の余地があります。

XML ファイルは、解析中に他のファイルからのテキストをインライン化するためのエンティティをサポートしています。複雑な xml ファイルが見られる場合は、この手法を使用してファイルをモジュール化しています。

Properties.propertiesは、キーと値のペアを使用する一般的な形式と xml 形式の 2 つのファイル形式をサポートするようになりました。Propertiesxml ファイルを読み込んだり、xml ファイルから保存したりできます。

ResourceBundle1 つの直接サブクラスがあります: PropertyResourceBundle. このクラスは実際には古いキーと値のペア形式に限定されているように見えますが、別のクラスを実装するために使用できます。XMLPropertyResourceBundleたとえば、xml ファイルからプロパティを読み取ることができるクラスで、entityトリックがそれらのファイルをモジュール化するのに役立ちます。

これが機能する場合、既存のプロパティ ファイルを xml プロパティ ファイルに変換するのは簡単です。Propertiesクラスを使用し、標準形式から読み取って XML に保存するだけです。

于 2011-01-06T12:20:27.457 に答える