de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Aza
Aza
Вопрос

getResourceAsStream возвращает null

Я загружаю текстовый файл из пакета в скомпилированном JAR моего Java-проекта. Соответствующая структура каталогов выглядит следующим образом:

/src/initialization/Lifepaths.txt

Код, используемый для загрузки файла, следующий:

public class Lifepaths {
    public static void execute() {
        System.out.println(Lifepaths.class.getClass().
            getResourceAsStream("/initialization/Lifepaths.txt"));
    }

    private Lifepaths() {}

    //This is temporary; will eventually be called from outside
    public static void main(String[] args) {execute();}
}

На печать всегда выводится null, независимо от того, что я использую. Я'не уверен, почему вышеупомянутое не работает, поэтому я'также попробовал:

  • `"/src/initialization/Lifepaths.txt".
  • "initialization/Lifepaths.txt"
  • "Lifepaths.txt"

Ни один из этих вариантов не работает. I've read numerous questions so far on the topic, but none of them have been helpful - usually, they just say to load files using the root path, which I'm already doing. Это, или просто загрузить файл из текущего каталога (просто load filename), что я'также пробовал. Файл компилируется в JAR в соответствующем месте с соответствующим именем.

Как мне решить эту проблему?

163 2013-05-15T16:37:01+00:00 14
Valeriu
Valeriu 50848
Редактировал вопрос 1-го января 2022 в 3:51
 Community
Community
Редактировал вопрос 23-го мая 2017 в 11:55
Eclipse getResourceAsStream returning null - Stack Overflow
I cannot get getResourceAsStream to find a file. I have put the file in the top level dir, target dir, etc, etc and have tried it with a "/" in front as well. Everytime it returns null.

Any
stackoverflow.com
Программирование
resources
java
file-io
Востребованные видео
How to fix a .getClass().getResource(path) NullPointerException | Java Tutorial
How to fix a .getClass().getResource(path) NullPointerException | Java Tutorial
7 лет назад
Я Взломал СЕРВЕР ДОМЕРА и ЗАТРОЛЛИЛ ЕГО во время стрима в Майнкрафт
Я Взломал СЕРВЕР ДОМЕРА и ЗАТРОЛЛИЛ ЕГО во время стрима в Майнкрафт
4 месяца назад
How to read file from JAR file (classpath) : javavids
How to read file from JAR file (classpath) : javavids
9 лет назад
« Назад
Вперёд »
Решение / Ответ
 hoaz
hoaz
15-го мая 2013 в 5:06
2013-05-15T17:06:24+00:00
Дополнительно
Источник
Редактировать
#19375206

Lifepaths.class.getClass().getResourceAsStream(...) загружает ресурсы с помощью системного загрузчика классов, очевидно, что это не удается, поскольку он не видит ваши JAR-файлы

Lifepaths.class.getResourceAsStream(...) загружает ресурсы, используя тот же загрузчик классов, который загрузил класс Lifepaths, и он должен иметь доступ к ресурсам в ваших JAR-ах

Valeriu
Valeriu 50848
Редактировал ответ 1-го января 2022 в 3:51
144
0
 Puce
Puce
15-го мая 2013 в 4:50
2013-05-15T16:50:50+00:00
Дополнительно
Источник
Редактировать
#19375205

Правила следующие:

  1. проверьте расположение файла, который вы хотите загрузить, внутри JAR (и таким образом убедитесь, что он действительно добавлен в JAR)
  2. используйте либо абсолютный путь: путь начинается в корне JAR
  3. использовать относительный путь: путь начинается с каталога пакета класса, который вы вызываете getResource/ getResoucreAsStream

И попробуйте:

Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")

вместо

Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")

(не уверен, что это имеет значение, но первый будет использовать правильный ClassLoader/ JAR, в то время как я не уверен во втором)

Valeriu
Valeriu 50848
Редактировал ответ 1-го января 2022 в 3:52
55
0
 greedybuddha
greedybuddha
15-го мая 2013 в 5:12
2013-05-15T17:12:36+00:00
Дополнительно
Источник
Редактировать
#19375207

Таким образом, существует несколько способов получить ресурс из jar, и каждый из них имеет немного отличающийся синтаксис, где путь должен быть указан по-разному.

Лучшее объяснение, которое я видел, это статья из JavaWorld. Я подытожу здесь, но если вы хотите узнать больше, вам следует ознакомиться со статьей.

Методы

  1. ClassLoader.getResourceAsStream().

Формат: "/"-разделенные имена; без ведущих "/" (все имена абсолютные).

Пример: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");.

  1. Class.getResourceAsStream().

Формат: "/"-разделенные имена; ведущее "/" указывает на абсолютные имена; все остальные имена являются относительными к классу'пакету

Пример: this.getClass().getResourceAsStream("/some/pkg/resource.properties");.

Valeriu
Valeriu 50848
Редактировал ответ 1-го января 2022 в 3:52
 potame
potame
Редактировал ответ 12-го июля 2016 в 12:29
44
0
Paul Smith
Paul Smith
16-го июля 2014 в 3:58
2014-07-16T15:58:24+00:00
Дополнительно
Источник
Редактировать
#19375210

Не используйте абсолютные пути, сделайте их относительными к директории 'resources' в вашем проекте. Быстрый и грязный код, который отображает содержимое файла MyTest.txt из каталога 'resources'.

@Test
public void testDefaultResource() {
    // can we see default resources
    BufferedInputStream result = (BufferedInputStream) 
         Config.class.getClassLoader().getResourceAsStream("MyTest.txt");
    byte [] b = new byte[256];
    int val = 0;
    String txt = null;
    do {
        try {
            val = result.read(b);
            if (val > 0) {
                txt += new String(b, 0, val);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    } while (val > -1);
    System.out.println(txt);
}
Valeriu
Valeriu 50848
Редактировал ответ 1-го января 2022 в 3:52
14
0
 MrD
MrD
26-го мая 2013 в 8:55
2013-05-26T20:55:49+00:00
Дополнительно
Источник
Редактировать
#19375208

Вы можете попробовать это, чтобы получить поток я.е сначала нужно получить URL-адрес и затем открыть его как поток.

URL url = getClass().getResource("/initialization/Lifepaths.txt"); 
InputStream strm = url.openStream(); 

Я когда-то был подобный вопрос: https://stackoverflow.com/questions/16563622/reading-txt-file-from-jar-fails-but-reading-image-works/16564611#16564611

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:34
9
0
Binita Bharati
Binita Bharati
27-го сентября 2015 в 1:56
2015-09-27T01:56:03+00:00
Дополнительно
Источник
Редактировать
#19375213

Там, кажется, проблема с classloader, который вы используете. Используйте contextClassLoader для загрузки класса. Это независимо от того, является ли он в статическом/нестатический метод

Резьба.currentThread().getContextClassLoader().методаgetresourceasstream......

7
0
 plosco
plosco
8-го ноября 2016 в 12:12
2016-11-08T00:12:31+00:00
Дополнительно
Источник
Редактировать
#19375215

Я оказался в подобной проблеме. Так как я с помощью Maven мне нужно обновить pom.xml включить что-то вроде этого:

   ...
</dependencies>
<build>
    <resources>
        <resource>
            <directory>/src/main/resources</directory>
        </resource>
        <resource>
            <directory>../src/main/resources</directory>
        </resource>
    </resources>
    <pluginManagement>
        ...

Обратите внимание на метки ресурса там, чтобы указать, где эта папка находится. Если у вас есть вложенные проекты (как я), то вы, возможно, захотите, чтобы получить ресурсы из других областей, а не только в модуле, в котором вы работаете. Это помогает уменьшить сохраняя тот же файл в каждой сделки РЕПО при использовании подобных данных конфигурации

4
0
Bobby Martin
Bobby Martin
21-го июля 2015 в 1:33
2015-07-21T01:33:08+00:00
Дополнительно
Источник
Редактировать
#19375212

Убедитесь, что ваш каталог ресурсов (например, на "НИЦ", у) находится в вашем classpath (убедитесь, что он's для исходного каталога в свой путь сборки в Eclipse).

Убедитесь, что clazz загружается из главного загрузчика.

Затем для загрузки src/initialization/Lifepaths.txt используйте

clazz.getResourceAsStream("/initialization/Lifepaths.txt");

Почему: clazz.getResourcesAsStream(ФОО) ищет Foo из в пределах класса clazz, по отношению к жизни clazz каталог в. Ведущих и"/" и делает его загрузить из корня любой каталог в classpath clazz.

Если вы're в контейнер какой-то, как Tomcat или делаете что-то с загрузчиками классов напрямую, вы можете просто относитесь к своим затмение/командной строке путь к классу, как только загрузчиком классов.

2
0
Leo Ufimtsev
Leo Ufimtsev
5-го января 2015 в 6:53
2015-01-05T18:53:07+00:00
Дополнительно
Источник
Редактировать
#19375211

Дон'т знать, если помогают, но в моем случае у меня был свой ресурс в папке /src/ и получал эту ошибку. Затем я переместил картинку в папку bin и исправили проблему.

2
0
Shijing Lv
Shijing Lv
21-го сентября 2019 в 4:00
2019-09-21T16:00:31+00:00
Дополнительно
Источник
Редактировать
#19375217

Грубо говоря:

getClass().методу getresource (и"/", у) нить~=.currentThread().getContextClassLoader().методу getresource (и".&и")

Предположим, структура проекта, как следующее:

`` ├── ГРЦ │   ├── главная │   └── тест │ испытания └── │ ├── Ява │ │   └── ком │ │   └── на GitHub │ │   └── АБВ │ │   └── прое │ │   ├── MainTest.java │ │   └── TestBase.java │ └── ресурсов │ └── abcd.txt └── целевые тест-классы └── ├── сом └── abcd.txt

``

`` // в MainClass.java это.getClass.ГТ; и quot методу getresource(" в/то") -&;~/proj_dir/целевой/тест-классы/"по это.getClass.методу getresource (и".&и") -> и"~/proj_dir/целевой/тест-классы/ком/гитхаб/ской/прое/с" Нить.currentThread().getContextClassLoader().getResources (и".&и") -> и"~/proj_dir/целевой/тест-классы/"и Нить.currentThread().getContextClassLoader().getResources(" в/то") -> нуль

``

1
0
 Feku279
Feku279
1-го октября 2019 в 10:00
2019-10-01T10:00:27+00:00
Дополнительно
Источник
Редактировать
#19375218

если вы не используете Maven убедитесь, что ваша упаковка 'цветы' Не 'пом'.

<packaging>jar</packaging>
1
0
 CommonCoreTawan
CommonCoreTawan
16-го декабря 2015 в 10:43
2015-12-16T22:43:20+00:00
Дополнительно
Источник
Редактировать
#19375214

Что работал для меня было, чтобы добавить файл в мой проект/ресурсы Java/src и потом использовать

this.getClass().getClassLoader().getResourceAsStream(myfile.txt);

Я не'т должны явным образом добавить этот файл в путь (при добавлении его в /ГРЦ это очевидно)

0
0
 ridox
ridox
9-го июля 2019 в 9:37
2019-07-09T09:37:04+00:00
Дополнительно
Источник
Редактировать
#19375216

JVM по умолчанию classloader-загрузчик будет использовать родитель-classloader загрузить ресурсы в первую очередь: deletegate-parent-classloader.

Lifepaths.класс.getClass()'с загрузчиком это загрузчик загрузчика классов, поэтомуметодаgetresourceasstreamбудет искать только $переменной JAVA_HOME, независимо от пользователя при условииклассов`. Очевидно, Lifepaths.txt нет.

Lifepaths.class 'ы classloader является путь к классу системного загрузчика классов, так методаgetresourceasstream поиск пользовательских классов и Lifepaths.txt есть.

При использовании Ява.яз.Класс#методаgetresourceasstream(имя строки), имя которого не начинается с **&#39;/&#39;** будет добавлено имя пакета в качестве префикса. Если вы хотите избежать этого, пожалуйста, используяЯва.яз.Класслоадер#методаgetresourceasstream`. Например: Ява Загрузчиком загрузчик = нить.currentThread().getContextClassLoader(); Строки имя_ресурса = "и Lifepaths.тхт и"; ResourceStream класса InputStream = загрузчик.методаgetresourceasstream(имя_ресурса);

0
0
 Jain
Jain
23-го апреля 2014 в 9:19
2014-04-23T09:19:51+00:00
Дополнительно
Источник
Редактировать
#19375209

@Emracool... я'd предлагает вам альтернативу. Поскольку вы, кажется, пытаюсь загрузить *.файл txt. Лучше использовать FileInputStream (), а затем getClass это раздражает ().getClassLoader().getresourceasstream (), как или getClass().getresourceasstream (), как. По крайней мере, ваш код будет выполняться правильно.

-12
0
Похожие сообщества 12
pro.jvm
pro.jvm
5 864 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat Конфы: @jvmconf ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 061 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 441 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
pro.JVM Jobs Chat
pro.JVM Jobs Chat
2 418 пользователей
Чат для обсуждения вакансий на JVM языках. Правила: - Никакого спама - Никакого троллинга и оскорблений участников - Размещение вакансий только через канал Канал для вакансий: @jvmjobs Основной чат: @jvmchat Наши друзья: @scala_jobs, @scala_jobs_feed
Открыть telegram
Java/Kotlin and more
Java/Kotlin and more
1 824 пользователей
чат о Java/Kotlin и связанных технологиях. We're discussing: job, tech questions etc. languages: russian, java, eng, kotlin Ссылка на чат: t.me/springframeworkio
Открыть telegram
Joker, Java-конференция
Joker, Java-конференция
1 658 пользователей
Канал конференции: @jokerconf_channel
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Zuxriddin Muydinov
Зарегистрирован 3 часа назад
2
Денис Анненский
Зарегистрирован 2 дня назад
3
365
Зарегистрирован 6 дней назад
4
True Image
Зарегистрирован 1 неделю назад
5
archana agarwal
Зарегистрирован 1 неделю назад
DE
EL
ES
FR
ID
IT
JA
KO
NL
PT
RO
RU
TR
ZH
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией