我想在没有实际加载的情况下检查是否存在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;
}
}
答案 0 :(得分:5)
如果默认捆绑包必须存在,您可以执行以下操作:
Class.getResource("/my/path/to/bundle.properties")
它将返回该文件的URL,如果它不存在则返回null。
当然,如果您有很多,请使用正确的类或类加载器。
编辑:如果你有资源作为课程,你还必须检查
Class.getResource("/my/path/to/bundle.class")
在Java 6中,您可以将资源包存储在XML中。我不知道ResourceBundle类如何查找这个资源,但我敢打赌它的方式是一样的。
答案 1 :(得分:0)
您可以加载捆绑包,然后进行检查,然后拨打ResourceBundle.clearCache()
以便下次再次加载它们。
这种情况发生一次(在初始化时),并不是一个如此繁重的操作,因此不会出现问题。
或者您可以简单地尝试查找类路径中是否存在资源。例如,回退.properties文件或默认语言环境的属性文件。
最后,在查看ResourceBundle.Control
的代码后,您可以选择在newBundle()
方法中执行操作。
答案 2 :(得分:0)
这样的事,也许是
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,如果找不到程序将退出