Pobieranie strumienia wejściowego z zasobu classpath (plik XML)


81

W aplikacji internetowej Java, załóżmy, że jeśli chcę pobrać InputStream pliku XML, który jest umieszczony w CLASSPATH (tj. W folderze źródeł ), jak mam to zrobić?

Odpowiedzi:


99

ClassLoader.getResourceAsStream().

Jak stwierdzono w komentarzu poniżej, jeśli jesteś w wielu ClassLoaderśrodowiskach (takich jak testy jednostkowe, aplikacje internetowe itp.), Może być konieczne użycie Thread.currentThread().getContextClassLoader(). Zobacz http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .


Zobacz osobisty post z przykładem kodu: tshikatshikaaa.blogspot.nl/2012/07/…
— Jérôme Verstrynge

14
Jeśli pracujesz w środowisku z wieloma klasami ładującymi (takim jak testy jednostkowe / webapps itp.), Może być konieczne użycie tego Thread.currentThread (). GetContextClassLoader (). Zobacz stackoverflow.com/questions/2308188/…
— khylo

Dodaj sugestię @ khylo do swojej odpowiedzi!
— froginvasion

8
Inny sposób:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
— zhuguowei

1
@zhuguowei ClassPathResource to klasa Spring.
— ichalos

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

ale jeśli Deploy aplikacji internetowych w tomcat ten sposób dostanie błąd: java.lang.NullPointerException: null i najprostszym sposobem wydaje mi sięnew ClassPathResource("/path/to/your/file").getInputStream()
— zhuguowei

czy możesz powiedzieć, jak udostępnić go na wojnie
— Vikram Saini,

Mam ten sam problem podczas wdrażania. Czy ktoś może znaleźć rozwiązanie tej sytuacji?
— Augusto,

12

To zależy od tego, gdzie dokładnie znajduje się plik XML. Czy znajduje się w folderze źródeł (w „pakiecie domyślnym” lub „głównym”), czy w tym samym folderze co klasa?

W pierwszym przypadku musisz użyć " /file.xml" (zwróć uwagę na początkowy ukośnik), aby znaleźć plik i nie ma znaczenia, której klasy użyjesz do zlokalizowania go.

Jeśli plik XML znajduje się obok jakiejś klasy, SomeClass.class.getResourceAsStream()wystarczy podać nazwę pliku.


11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") i upewnij się, że skrypt kompilujący kopiuje plik xml do odpowiedniego miejsca w Twojej CLASSPATH.


6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();


lub getClass().getResourceAsStream("...")itp.
— rogerdpack

4

Niektóre z opcji „getResourceAsStream ()” w tej odpowiedzi nie działały w moim przypadku, ale ta:

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


0

Wypróbowałem proponowane rozwiązanie i ukośnik w nazwie pliku nie zadziałał, na przykład: ... (). GetResourceAsStream ("/ my.properties"); null został zwrócony

Usunięcie ukośnika zadziałało: .... getResourceAsStream ("my.properties");

Tutaj jest z doc API: Przed delegacją, bezwzględna nazwa zasobu jest konstruowana z podanej nazwy zasobu przy użyciu tego algorytmu:

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'). 

W moim przypadku, był już null bez/ . Dodanie znaku ukośnego działało dla mnie. Musi istnieć jakaś inna różnica między @ hussein-terek a moją konfiguracją i twoją konfiguracją.
— Ajoy Bhatia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.