Загрузка файлов с помощью ClassLoader

эта проблема беспокоила меня некоторое время. Мне нужно загрузить пару файлов в мое приложение java, и единственный способ, которым я работал до сих пор, выглядит так:

URL hsURL;
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}
else {
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}

но это уродливо и ужасно. Какое-то время я думал, что у меня это работает:

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs");

но это больше не работает по какой-то причине (я, должно быть, что-то изменил и не заметил. Он возвращает значение null.

должен ли я использовать getResource () вместо getSystemResource() (если да, то почему getSystemResource () статический, но не getResource ())?

Я использую eclipse, и я попытался включить папку в путь сборки (classpath), а не включать ее, это, похоже, не имеет значения.

2 ответов


getSystemResource является статическим, потому что он будет использовать система classloader, который доступен статически. (ClassLoader.getSystemClassLoader)

если ваш ресурс доступен в пути к классам, я бы предложил использовать ClassLoader.getResource() или Class.getResource из соответствующего класса, например,

Foo.class.getResource("/helpsets/helpset.hs");

(ClassLoader.getResource - это "абсолютная"; Class.getResource относится к пакету класса, если вы не добавляете к нему префикс'/'.)

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

EDIT: обычно я нахожу URL менее полезным, чем InputStream, поэтому я использую getResourceAsStream вместо getResource. YMMV


Вы упомянули здесь несколько разных вещей, поэтому давайте разберемся в них.

1) создание" файла: "URL на основе" пользователя.реж.--2-->

"пользователя.свойство " dir " относится к текущему рабочему каталогу-где бы ни находился пользователь при запуске приложения. Скорее всего, файлы, написанные здесь, исчезнут между двумя запусками (потому что пользователь может работать из другого каталога).

"пользователя.home " свойство относится к домашнему каталогу пользователя -- который должен оставаться неизменным между прогонами.

в любом случае используйте объект File для открытия файлов, не возитесь с созданием URL-адреса "file:". Вы не получаете никакой выгоды, и, как вы можете видеть, Вам нужно написать беспорядочный код для доступа к нему.

2) получение ресурса через classloader

это предназначено для извлечения файлов, которые упакованы с вашим приложением -- только для чтения файлов. Как вы уже видели, существует несколько вариантов. Я предпочитаю использовать следующее, потому что Я предполагаю, что класс захочет загрузить файл, который упакован с ним.

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);