ClassLoader.getResourceAsStream() путаница

Я новичок в Java.

У меня есть требование загрузить файл конфигурации (только один раз, при запуске приложения). Каков наилучший способ сделать это? У меня есть следующие идеи:

  • Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);
  • getClass().getClassLoader().getResourceAsStream(resourceName);

Из этих двух, что является лучшим и почему?

Скажем, например, у меня есть метод, как показано ниже

public void loadConfig(String name) {
    InputStream streamByContextClassLoader = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
}

Если я вызываю этот метод несколько раз, загружается ли файл конфигурации несколько раз? Может ли кто-нибудь прояснить мои сомнения?

2 ответа

Решение

Я рекомендую использовать первый подход, так как он будет работать в случаях, когда второй подход не будет:

Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);

Однажды я первоначально использовал второй подход в тесте JUnit, а затем нам пришлось изменить его, чтобы использовать загрузчик класса контекста, чтобы разрешить запуск теста из IDE.

Смотрите: Разница между загрузчиком классов контекста потока и обычным загрузчиком классов, особенно в этой строке

"В этом случае объект должен использовать Thread.currentThread(). GetContextClassLoader() напрямую, если он хочет загрузить ресурсы, которые недоступны в его собственном загрузчике классов".

Java использует несколько загрузчиков классов во время выполнения. Было бы намного проще использовать явное объявление файла вместо ресурсов. Взгляните на конфигурацию Commons.

О загрузчиках классов Java вы можете прочитать в официальных документах Oracle. Если вы упаковываете конфигурацию в свои классы (в jar-файл) - вы можете использовать YourClass.class.getResourceAsStream(...). В остальных случаях - предпочитайте использовать явный файл конфигурации.

И да, несколько вызовов getResourceAsStream будут загружать этот ресурс несколько раз. Чтобы прояснить это, взгляните на источники java.net.URLClassLoader#getResourceAsStream.

Другие вопросы по тегам