Получение входного потока из ресурса classpath (файл XML)
В веб-приложении на Java. Предположим, если я хочу получить InputStream XML-файла, который находится в CLASSPATH (то есть в папке источников), как мне это сделать?
7 ответов
ClassLoader.getResourceAsStream()
,
Как указано в комментарии ниже, если вы находитесь в ClassLoader
окружение (например, модульное тестирование, веб-приложения и т. д.), которое вам может понадобиться Thread.currentThread().getContextClassLoader()
, См. /questions/36399910/getresourceasstream-protiv-fileinputstream/36399917#36399917.
Это зависит от того, где именно находится 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').