Загрузка файлов с помощью 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);