Получение входного потока из ресурса classpath (файл XML) - PullRequest
76 голосов
/ 27 апреля 2009

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

Ответы [ 7 ]

92 голосов
/ 27 апреля 2009

ClassLoader.getResourceAsStream().

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

30 голосов
/ 04 ноября 2010
ClassLoader.class.getResourceAsStream("/path/file.ext");
12 голосов
/ 27 апреля 2009

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

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

Если файл XML находится рядом с каким-то классом, SomeClass.class.getResourceAsStream() с указанием только имени файла - путь.

11 голосов
/ 27 апреля 2009

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

6 голосов
/ 27 апреля 2009
.

someClassWithinYourSourceDir.getClass () getResourceAsStream ();

4 голосов
/ 06 августа 2014

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

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

0 голосов
/ 29 января 2018

Я попробовал предлагаемое решение, и косая черта в имени файла не работала, например: ... (). 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'). 
...