Загрузка файлов с ClassLoader - PullRequest
11 голосов
/ 13 июля 2009

Эта проблема меня давно беспокоила. Мне нужно загрузить пару файлов в мое 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");

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

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

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

Ответы [ 2 ]

24 голосов
/ 13 июля 2009

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

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

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

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

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

РЕДАКТИРОВАТЬ: я обычно нахожу URL менее полезным, чем InputStream, поэтому я использую getResourceAsStream вместо getResource. YMMV

3 голосов
/ 13 июля 2009

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

1) Создание URL "file:" на основе "user.dir"

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

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

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

2) Получение ресурса через загрузчик классов

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

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...