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.