Как проверить, является ли Java ResourceBundle загружаемым, не загружая его?

Я хотел бы проверить существование ResourceBundle, на самом деле не загружая его.

Как правило, я использую Guice, и во время инициализации, я хочу проверить существование, в то время как во время выполнения, я хочу загрузить его. Если пакет не существует, я хочу прежний отчет неотъемлемости RB.

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

Править:

Хорошо, я нашел способ сделать это. Я создам ResourceBundle. Управление, которое расширяемо (использование custome addFormat (Строка, Класс)) для хранения всех форматов пакета, затем использует другой мой собственный метод для проверки всех возможных имен файлов на определенную локаль (использующий 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;
  }
}
5
задан Olivier Grégoire 30 July 2013 в 07:36
поделиться

3 ответа

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

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

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

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

0
ответ дан 14 December 2019 в 19:14
поделиться
-

Что-то вроде этого, может быть,

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
ответ дан 14 December 2019 в 19:14
поделиться

Вы можете попробовать наш LibTiff.Net. Это бесплатная версия LibTiff с открытым исходным кодом, написанная с помощью управляемого C #. API нашей реализации держался очень похож на оригинальный.

http://bitmiracle.com/libtiff/

Мы только что выпустили его, поэтому могут быть ошибки. Но полный исходный код поставляется с рядом тестов, поэтому наиболее очевидные ошибки должны быть исправлены.

-121--3153550-

Привязка времени загрузки - это когда символы в библиотеке, на которые ссылается исполняемый файл (или другая библиотека), обрабатываются операционной системой при загрузке исполняемого файла/библиотеки в память.

Привязка во время выполнения - это когда вы используете API, предоставленный ОС, или через библиотеку для загрузки DLL или DSO, когда это необходимо, и затем выполняете разрешение символа.

Я знаю больше о Linux DSO, чем Windows DLL, но принцип должен быть таким же. .NET библиотеки могут отличаться.

В Linux архитектуры плагинов выполняются таким путем. Программа будет использовать связь во время выполнения для загрузки библиотеки и вызова некоторых функций. Тогда, возможно, разгрузите его. Он также позволяет загружать несколько библиотек с одинаковыми экспортированными символами без конфликтов. Я думаю, что DLL будут работать во многом в том же способе.

Исполняемые файлы имеют «пустые места» в таблицах символов, которые необходимо заполнить какой-либо библиотекой. Эти пробелы обычно заполняются во время загрузки или компиляции. Можно устранить необходимость в «пустых местах» в таблице символов с помощью связывания во время выполнения.

Другим сценарием, в котором связь во время выполнения полезна, является отладка библиотек или выбор из нескольких библиотек, совместимых с ABI/API во время выполнения. У меня часто есть библиотека, скажем «foo» и одна называется «foo_unstable» и есть тестовое приложение, которое переключается между 2 и делает некоторое тестирование.

Для просмотра библиотек, на которые ссылается исполняемый файл во время загрузки, выполните команду ldd и получите выходные данные, такие как (on/bin/ls):

linux-vdso.so.1 =>  (0x00007fff139ff000)
librt.so.1 => /lib64/librt.so.1 (0x0000003c4f200000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003c4fa00000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003c53a00000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003c58e0000

Операционная система попытается загрузить библиотеки (файлы .so) во время загрузки. Возможно, библиотека уже имеется в памяти.

-121--2104154-

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

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

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

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

EDIT: при наличии ресурсов в качестве классов необходимо также проверить

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

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

5
ответ дан 14 December 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: