Как проверить, может ли Java ResourceBundle загружаться, не загружая его? - PullRequest
5 голосов
/ 13 января 2010

Я хотел бы проверить существование ResourceBundle без его фактической загрузки.

Обычно я использую Guice, и во время инициализации я хочу проверить существование, в то время как во время выполнения я хочу загрузить его. Если пакет не существует, я хочу получить раннее сообщение о несуществовании РБ.

Если бы можно было получить экземпляр ResourceBundle.Control, используемый для определенного ResourceBundle, у меня не возникло бы проблем с получением базовой информации для построения фактического имени ресурса (используя toBundleName () и toResourceName ()), но это не так дело на этом уровне.

Edit:

Хорошо, я нашел способ сделать это. Я создам 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;
  }
}

Ответы [ 3 ]

5 голосов
/ 13 января 2010

Если пакет по умолчанию должен существовать, вы можете сделать:

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

и вернет URL-адрес файла или ноль, если он не существует.

Конечно, используйте правильный класс или загрузчик классов, если у вас их много.

РЕДАКТИРОВАТЬ: если у вас есть ресурсы в качестве классов, вы должны также проверить

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

В Java 6 вы можете хранить пакеты ресурсов в XML. Я не знаю, как класс ResourceBundle ищет этот ресурс, но держу пари, что он точно так же.

0 голосов
/ 13 января 2010

Как то так, может быть

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, если программа не найдена, программа завершит работу

0 голосов
/ 13 января 2010

Вы можете загрузить пакеты, тем самым сделав свои проверки, а затем вызвать ResourceBundle.clearCache(), чтобы они снова загрузились в следующий раз.

Это происходит один раз (во время инициализации), и это не такая сложная операция, так что это не будет проблемой.

Или вы можете просто попытаться выяснить, присутствует ли ресурс в пути к классам. Например, резервный файл .properties или файл свойств для локали по умолчанию.

Наконец, после просмотра кода для ResourceBundle.Control, у вас есть возможность сделать то, что они делают в методе newBundle().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...