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:
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 .
InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
ClassLoader.class.getResourceAsStream("/path/file.ext");
java.lang.NullPointerException: null
i najprostszym sposobem wydaje mi sięnew ClassPathResource("/path/to/your/file").getInputStream()
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.
someClassWithinYourSourceDir.getClass (). getResourceAsStream ();
getClass().getResourceAsStream("...")
itp.
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').
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ą.