How to check if a Java ResourceBundle is loadable, without loading it?
java, resourcebundle
Solution
If the default bundle must exists you can do:
Class.getResource("/my/path/to/bundle.properties")
and it will return an URL to the file or null if it doesn't exists.
Of course use the correct class or classloader if you have many.
EDIT: if you have resources as classes you have to check also
Class.getResource("/my/path/to/bundle.class")
In Java 6 you can store resource bundles in XML. I don't know how ResourceBundle class lookups this resource, but I bet it's in the same way.
Problem
I would like to check the existence of a ResourceBundle without actually loading it. Typically, I'm using Guice, and at initialization time, I want to check the existence, while at execution time, I want to load it. If the bundle doesn't exist, I want an early report of the inexistence of the RB. If it was possible to get the ResourceBundle.Control instance used for a specific ResourceBundle, I would have no problem getting the basic information to build the actual resource name (using toBundleName() and toResourceName()), but it is not the case at that level. Edit: Ok, I found the way to do it. I'll create a ResourceBundle.Control that is extensible (using a custome addFormat(String, Class)) to store all the bundle formats, then use another method of my own to check all possible file names for a specific locale (using Class.getResource as indicated here below). Coding speaking: ``` 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; } } ```