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.