Ottenere l'InputStream da una risorsa classpath (file XML)
-
16-09-2019 - |
Domanda
In applicazioni Web Java, Supponiamo che se voglio ottenere l'InputStream di un file XML, che si trova nel CLASSPATH (cioè all'interno delle fonti cartella), come faccio a fare?
Soluzione
ClassLoader.getResourceAsStream()
.
Come indicato nel commento qui sotto, se ci si trova in un ambiente multi-ClassLoader
(come unit testing, webapps, ecc) potrebbe essere necessario utilizzare Thread.currentThread().getContextClassLoader()
. Vedere http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .
Altri suggerimenti
ClassLoader.class.getResourceAsStream("/path/file.ext");
Questo dipende da dove esattamente il file XML è. E 'nella cartella fonti (nel "pacchetto di default" o il "root") o nella stessa cartella della classe?
In per primo caso, è necessario utilizzare "/file.xml
" (notare lo slash iniziale) per trovare il file e non importa quale classe si utilizza per cercare di individuarlo.
Se il file XML si trova accanto a qualche classe, SomeClass.class.getResourceAsStream()
con solo il nome del file è la strada da percorrere.
ClassLoader.class.getResourceAsStream("/path/to/your/xml")
e fare in modo che lo script di compilazione sta copiando il file xml dove nel classpath.
someClassWithinYourSourceDir.getClass () getResourceAsStream ();.
Alcuni dei "getResourceAsStream ()" opzioni in questa risposta non ha funzionato per me, ma questo fatto:
SomeClassWithinYourSourceDir.class.getClassLoader () getResourceAsStream ( "yourResource");.
ho provato proposto soluzioni e barra nel nome del file non ha funzionato per me, ad esempio:. ... () getResourceAsStream ( "/ my.properties"); nulla è stato restituito
La rimozione della barra ha funzionato: .... getResourceAsStream ( "my.properties");
Qui è da doc API: Prima di delega, di un nome della risorsa assoluto è costruito il nome della risorsa usando questo algoritmo:
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').