Отримання вхідного потоку з ресурсу classpath (файл XML)


81

Припустимо, у веб-програмі Java, якщо я хочу отримати InputStream XML-файлу, який розміщений у CLASSPATH (тобто всередині папки джерел ), як мені це зробити?

Відповіді:


99

ClassLoader.getResourceAsStream().

Як зазначено в коментарі нижче, якщо ви перебуваєте в мультисередовищі ClassLoader(наприклад, модульне тестування, веб-додатки тощо), вам може знадобитися використовувати Thread.currentThread().getContextClassLoader(). Див. Http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .


Див. Особисте повідомлення для прикладу коду: tshikatshikaaa.blogspot.nl/2012/07/…
Jérôme Verstrynge

14
Якщо ви перебуваєте в середовищі завантажувача декількох класів (наприклад, модульне тестування / веб-додатки тощо), можливо, вам доведеться використовувати цей Thread.currentThread (). GetContextClassLoader (). Див stackoverflow.com/questions/2308188 / ...
khylo

Будь ласка, додайте пропозицію @ khylo до своєї відповіді!
froginvasion

8
Інший спосіб:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

1
@zhuguowei ClassPathResource - весняний клас.
ichalos

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

але якщо розгорнути веб-програму в tomcat, таким чином з'явиться помилка:, java.lang.NullPointerException: null і найпростіший спосіб, на мою думку,new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

Ви можете сказати, як зробити його доступним на війні
Вікрам Саїні,

У мене виникає та сама проблема, коли я розгортаю. Хтось може знайти рішення цієї ситуації?
Серпень

12

Це залежить від того, де саме знаходиться файл XML. Він знаходиться в папці джерел (у "пакунку за замовчуванням" або "кореневому") або в тій же папці, що і клас?

У попередньому випадку ви повинні використовувати "/file.xml " (зверніть увагу на косу риску), щоб знайти файл, і не має значення, який клас ви використовуєте, щоб спробувати його знайти.

Якщо XML-файл знаходиться поруч із класом, слід SomeClass.class.getResourceAsStream()лише вказати ім’я файлу.


11

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


6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();


або getClass().getResourceAsStream("...")ін.
rogerdpack

4

Деякі з параметрів "getResourceAsStream ()" у цій відповіді не працювали для мене, але цей:

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


0

Я спробував запропоноване рішення, і коса риска в назві файлу у мене не спрацювала, наприклад: ... (). GetResourceAsStream ("/ my.properties"); null було повернуто

Видалення косої риси спрацювало: .... 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'). 

У моєму випадку, я отримував null без/ . Додавання символу косої риси мені вдалося. Має бути якась інша різниця між @ hussein-terek та моїм налаштуванням та вашим налаштуванням.
Ajoy Bhatia
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.