如何检查Java ResourceBundle是否可加载,而不加载它?

Oli*_*ire 5 java resourcebundle

我想检查ResourceBundle的存在而不实际加载它.

通常,我正在使用Guice,并且在初始化时,我想检查存在,而在执行时,我想加载它.如果捆绑不存在,我想要早期报告RB的不存在.

如果有可能获得用于特定ResourceBundle的ResourceBundle.Control实例,我将获得构建实际资源名称的基本信息(使用toBundleName()和toResourceName())没有问题,但事实并非如此.那个级别.

编辑:

好的,我找到了办法.我将创建一个可扩展的ResourceBundle.Control(使用custom addFormat(String,Class))来存储所有包格式,然后使用我自己的另一种方法检查特定语言环境的所有可能的文件名(使用Class. getResource,如下所示).

编码说:

class MyControl extends ResourceBundle.Control {
  private Map<String,Class<? extends ResourceBundle>> formats = new LinkedHashMap();
  public void addFormat(String format,Class<? extends ResourceBundle> rbType) {
    formats.put(format, rbType);
  }
  public boolean resourceBundleExists(ClassLoader loader, String baseName, Locale locale) {
    for (String format: formats.keySet()) {
      // for (loop on locale hierarchy) {
        if (loader.getResource(toResourceName(toBundleName(baseName, locale), format)) != null) {
          return true;
        }
      // }
    }
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

hel*_*ios 5

如果默认包必须存在,您可以执行以下操作:

Class.getResource("/my/path/to/bundle.properties")
Run Code Online (Sandbox Code Playgroud)

它将返回该文件的URL,如果不存在则返回null.

当然,如果你有很多,请使用正确的类或类加载器.

编辑:如果您有资源作为类,您还必须检查

Class.getResource("/my/path/to/bundle.class")
Run Code Online (Sandbox Code Playgroud)

在Java 6中,您可以将资源包存储在XML中.我不知道ResourceBundle类如何查找这个资源,但我敢打赌它的方式是一样的.


Boz*_*zho 0

您可以加载捆绑包,从而进行检查,然后调用ResourceBundle.clearCache()以便下次再次加载它们。

这种情况只会发生一次(在初始化时),而且这不是一个繁重的操作,所以不会有问题。

或者您可以简单地尝试查找类路径上是否存在资源。例如,后备 .properties 文件或默认区域设置的属性文件。

最后,在查看 的代码后ResourceBundle.Control,您可以选择执行它们在newBundle()方法中所做的操作。