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?

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 .


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");

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.


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.


6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();


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");


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'). 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.