【问题标题】:How to check if a Java ResourceBundle is loadable, without loading it?如何在不加载的情况下检查 Java ResourceBundle 是否可加载?
【发布时间】:2011-01-04 13:49:43
【问题描述】:

我想在不实际加载的情况下检查 ResourceBundle 是否存在。

通常,我使用的是 Guice,在初始化时,我想检查是否存在,而在执行时,我想加载它。如果捆绑包不存在,我想要一份关于 RB 不存在的早期报告。

如果可以获取用于特定 ResourceBundle 的 ResourceBundle.Control 实例,那么获取构建实际资源名称的基本信息将没有问题(使用 toBundleName() 和 toResourceName()),但它不是那个级别的案例。

编辑:

好的,我找到了方法。我将创建一个可扩展的 ResourceBundle.Control(使用自定义 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;
  }
}

【问题讨论】:

    标签: java resourcebundle


    【解决方案1】:

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

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

    或者您可以简单地尝试查找资源是否存在于类路径中。例如后备 .properties 文件或默认语言环境的属性文件。

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

    【讨论】:

    • 我当然不想加载两次捆绑包。我想检查早期失败,所以不要把加载时间花在初始化时间。
    • 你为什么这么担心加载时间?它只发生一次,而且,加载一个包并不是最昂贵的操作。
    • 好吧,其实还有预初始化时间、初始化时间和运行时间。我在 Guice 上开发了一个 API,它需要快速失败,并且任何 IO 都很耗时,因此会变成“不那么快失败”。像在另一个答案中一样,执行一次 IO 检查是可以接受的,但不能完全加载,属性加载/解析等。简短回答:这是我的先决条件的一部分。
    • 这对我来说仍然很奇怪。应用程序甚至不应该经常启动。
    • 我理解您的担忧。我在计划项目时也有同样的想法,但项目的可扩展性解释了这个要求。顺便说一句,它不是 J2EE 应用程序:只有 J2SE 一个。
    【解决方案2】:

    如果默认包必须存在,你可以这样做:

    Class.getResource("/my/path/to/bundle.properties")
    

    它会返回一个指向文件的 URL,如果它不存在则返回 null。

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

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

    Class.getResource("/my/path/to/bundle.class")
    

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

    【讨论】:

    • 规则:捆绑“a.b.c”是资源“/a/b/c.properties”(默认文件)
    • 这个问题是我想我只有属性文件。我还不如拥有基于 XML 的属性或类。
    • 我给 Class.getResource() 加分,但根据我之前的评论,我没有得到问题的完整答案。
    • 明白。我不知道 XML 或类中的包 :)
    【解决方案3】:

    可能是这样的

    ResourceBundle bundle;
    public PropertiesExist() {
        String propsFile = "log4j";
        String propsPath = this.getClass().getClassLoader().getResource(".").getPath();
        File f = new File(propsPath, propsFile + ".properties");
        if(!f.exists()){
            System.out.println("File not found!!!!");
            System.exit(-1);
        }
        bundle = ResourceBundle.getBundle(propsFile);
        System.out.println(bundle.getString("log4j.rootLogger"));
    }
    
    public static void main(String[] args) {
         new PropertiesExist();         
    }
    

    这将查找日志文件 log4.properties,如果找不到程序将退出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 2013-11-21
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多