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ć?

Veera
źródło

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 .

cletus
źródło
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");
jkarretero
źródło
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.

Aaron Digulla
źródło
11

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

Clint
źródło
6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();

poseł.
źródło
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");

user64141
źródło
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'). 
Strajkowicz
źródło
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