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

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

7 ответов

Решение

ClassLoader.getResourceAsStream(),

Как указано в комментарии ниже, если вы находитесь в ClassLoader окружение (например, модульное тестирование, веб-приложения и т. д.), которое вам может понадобиться Thread.currentThread().getContextClassLoader(), См. /questions/36399910/getresourceasstream-protiv-fileinputstream/36399917#36399917.

ClassLoader.class.getResourceAsStream("/path/file.ext");

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

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

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

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

. SomeClassWithinYourSourceDir.getClass() getResourceAsStream();

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

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

По умолчанию каждый ресурс, добавленный в путь к классам в веб-приложении, копируется в папку WEB-INF/classes в развернутой войне.

Вы можете управлять этим при разработке приложения в eclipse через:

Щелкните правой кнопкой мыши проект -> свойства -> Путь сборки Java -> вкладка Источник -> Папка вывода по умолчанию

В вашем сервлете вы можете получить доступ к ресурсу, добавив к его пути префикс "/", который указывает на классы WEB-INF /.

Например, чтобы получить доступ к pdf-sample.pdf в WEB-INF/classes, вы можете использовать следующее:

getClass().getResourceAsStream("/pdf-sample.pdf")

Этот урок очень хорошо объясняет возможные способы чтения файла ресурсов из classpath в Java-приложении, его стоит прочитать.

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

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

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

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'). 
Другие вопросы по тегам