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.