我们正在使用 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");

其他提示

您可以通过编程,然而,构建资源包但你说你的文件是巨大的,如果那么它加载到内存中。

<强>更新

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文件,其中该技术已被用于modularise的文件。

Properties现在支持两种文件格式,用键/值对和一个XML格式的共同.properties格式。 Properties可以从XML文件加载和存储到/

ResourceBundle具有一个直接子类:PropertyResourceBundle。它看起来像这样的类实际上仅限于旧的键/值对格式,但它可以被用来实现其他类,如XMLPropertyResourceBundle它能够读取XML文件的属性,其中entity技巧可以帮助模块化这些文件。

如果这个工程 - 改造现有的属性文件的XML属性文件应该很容易,只需要使用Properties类,从标准格式和存储为XML阅读

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top