Abrufen des Eingabestreams von einer Klassenpfadressource (XML-Datei)

80

In Java - Web - Anwendung, Nehmen wir an, wenn ich die Input einer XML - Datei erhalten möchten, die in der CLASSPATH (dh innerhalb der platziert Quellen - Ordner), wie kann ich es tun?

Veera
quelle

Antworten:

95

ClassLoader.getResourceAsStream().

Wie im Kommentar unten angegeben, ClassLoadermüssen Sie möglicherweise mehrere Umgebungen verwenden (z. B. Unit-Tests, Webanwendungen usw.) Thread.currentThread().getContextClassLoader(). Siehe http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .

Cletus
quelle
Siehe persönliches Posting
Jérôme Verstrynge
13
Wenn Sie sich in einer Umgebung mit mehreren Klassenladern befinden (z. B. Unit-Tests / Webanwendungen usw.), müssen Sie möglicherweise diesen Thread.currentThread (). GetContextClassLoader () verwenden. Siehe stackoverflow.com/questions/2308188/…
khylo
Bitte fügen Sie Ihrer Antwort den Vorschlag von @ khylo hinzu!
Froginvasion
7
Ein anderer Weg:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
Zhuguowei
1
@zhuguowei ClassPathResource ist eine Spring-Klasse.
Ichalos
31
ClassLoader.class.getResourceAsStream("/path/file.ext");
jkarretero
quelle
Aber wenn die Webanwendung in Tomcat auf diese Weise java.lang.NullPointerException: null new ClassPathResource("/path/to/your/file").getInputStream()
bereitgestellt
Kannst du bitte sagen, wie du es im Krieg zur Verfügung stellen kannst?
Vikram Saini
Ich habe das gleiche Problem beim Bereitstellen. Kann jemand eine Lösung für diese Situation finden?
Augusto
12

Das hängt davon ab, wo genau sich die XML-Datei befindet. Befindet es sich im Quellordner (im "Standardpaket" oder im "Stammverzeichnis") oder im selben Ordner wie die Klasse?

Im ersten Fall müssen Sie " /file.xml" (beachten Sie den führenden Schrägstrich) verwenden, um die Datei zu finden, und es spielt keine Rolle, mit welcher Klasse Sie versuchen, sie zu finden.

Wenn sich die XML-Datei neben einer Klasse befindet, ist SomeClass.class.getResourceAsStream()nur der Dateiname der richtige Weg.

Aaron Digulla
quelle
11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") und stellen Sie sicher, dass Ihr Kompilierungsskript die XML-Datei an die Stelle in Ihrem CLASSPATH kopiert.

Clint
quelle
6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();

mP.
quelle
oder getClass().getResourceAsStream("...")etc.
Rogerdpack
4

Einige der "getResourceAsStream ()" - Optionen in dieser Antwort haben bei mir nicht funktioniert, aber diese hat funktioniert:

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

user64141
quelle
0

Ich habe die vorgeschlagene Lösung ausprobiert und ein Schrägstrich im Dateinamen hat bei mir nicht funktioniert. Beispiel: ... (). GetResourceAsStream ("/ my.properties"); null wurde zurückgegeben

Das Entfernen des Schrägstrichs hat funktioniert: .... getResourceAsStream ("my.properties");

Hier ist von der doc-API: Vor der Delegierung wird mit diesem Algorithmus aus dem angegebenen Ressourcennamen ein absoluter Ressourcenname erstellt:

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'). 
Stürmer
quelle
In meinem Fall kam ich null ohne die /. Das Hinzufügen des Schrägstrichs hat bei mir funktioniert. Es muss einen anderen Unterschied zwischen @ hussein-terek und meinem Setup und Ihrem Setup geben.
Ajoy Bhatia