java创建资源束_是否可以在资源束中包含资源束文件

小编典典

首先,我想知道为什么您选择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 getKeys() {

return properties != null ? (Enumeration) 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");

2020-10-09

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值