Получение входного потока из ресурса пути к классам (XML-файл)

В веб-приложении Java, предположим, если я хочу получить InputStream файла XML, который помещен в CLASSPATH (т.е. внутри папки sources), как мне это сделать?


person Veera    schedule 27.04.2009    source источник


Ответы (7)


ClassLoader.getResourceAsStream().

Как указано в комментарии ниже, если вы находитесь в среде с несколькими ClassLoader (например, модульное тестирование, веб-приложения и т. д.), вам может потребоваться использовать Thread.currentThread().getContextClassLoader(). См. http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .

person cletus    schedule 27.04.2009
comment
Если вы находитесь в среде с несколькими загрузчиками классов (например, модульное тестирование/веб-приложения и т. д.), вам может понадобиться использовать этот Thread.currentThread().getContextClassLoader(). См. stackoverflow.com/questions/2308188/ - person khylo; 28.02.2013
comment
Пожалуйста, добавьте предложение @khylo к своему ответу! - person froginvasion; 09.01.2015
comment
Другой способ: InputStream is = new ClassPathResource("/path/to/your/file").getInputStream() - person zhuguowei; 08.03.2018
comment
@zhuguowei ClassPathResource — это класс Spring. - person ichalos; 07.07.2018

Это зависит от того, где именно находится файл XML. Он находится в папке с исходным кодом (в «пакете по умолчанию» или «корне») или в той же папке, что и класс?

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

Если XML-файл находится рядом с каким-то классом, SomeClass.class.getResourceAsStream() с одним именем файла — это то, что нужно.

person Aaron Digulla    schedule 27.04.2009

ClassLoader.class.getResourceAsStream("/path/to/your/xml") и убедитесь, что ваш скрипт компиляции копирует файл xml в то место, где находится ваш CLASSPATH.

person Clint    schedule 27.04.2009

someClassWithinYourSourceDir.getClass().getResourceAsStream();

person mP.    schedule 27.04.2009
comment
или getClass().getResourceAsStream("...") и т. д. - person rogerdpack; 28.12.2016

Некоторые из параметров «getResourceAsStream()» в этом ответе у меня не сработали, но этот сработал:

SomeClassWithinYourSourceDir.class.getClassLoader().getResourceAsStream("yourResource");

person user64141    schedule 06.08.2014

Я попробовал предложенное решение, и косая черта в имени файла у меня не сработала, например: ...().getResourceAsStream("/my.properties"); ноль был возвращен

Удаление косой черты сработало: ....getResourceAsStream("my.properties");

Вот из doc API: Перед делегированием абсолютное имя ресурса создается из заданного имени ресурса с использованием этого алгоритма:

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e'). 
person Striker    schedule 29.01.2018
comment
В моем случае я получал null без /. Добавление символа косой черты сработало для меня. Должна быть какая-то другая разница между @hussein-terek и моей установкой и вашей установкой. - person Ajoy Bhatia; 01.06.2018

person    schedule
comment
но если развернуть веб-приложение в Tomcat таким образом, будет получена ошибка: java.lang.NullPointerException: null , и самый простой способ, я думаю, это new ClassPathResource("/path/to/your/file").getInputStream() - person zhuguowei; 08.03.2018
comment
не могли бы вы рассказать, как сделать его доступным во время войны - person Vikram Saini; 30.08.2018
comment
У меня такая же проблема при развертывании. Может кто нашел решение данной ситуации? - person Augusto; 06.09.2018