unterschiedliche Möglichkeiten zum Laden einer Datei als InputStream
Es gibt feine Unterschiede in der Interpretation des übergebenen Dateinamens. Grundsätzlich gibt es zwei verschiedene Methoden: ClassLoader.getResourceAsStream() und Class.getResourceAsStream(). Diese beiden Methoden suchen die Ressource auf unterschiedliche Weise.
In Class.getResourceAsStream(pfad) wird der Pfad als Pfad innerhalb des Pakets der Klasse interpretiert, von der aus Sie ihn aufrufen. Wenn Sie beispielsweise String.class.getResourceAsStream("myfile.txt") aufrufen, wird in Ihrem Klassenpfad an der folgenden Stelle nach einer Datei gesucht: "java/lang/myfile.txt". Wenn Ihr Pfad mit einem / beginnt, wird er als absoluter Pfad betrachtet und die Suche ab der Wurzel des Klassenpfads gestartet. Wenn Sie also String.class.getResourceAsStream("/myfile.txt") aufrufen, wird im Klassenpfad an der folgenden Stelle gesucht: ./myfile.txt.
ClassLoader.getResourceAsStream(pfad) betrachtet alle Pfade als absolute Pfade. Wenn Sie also String.class.getClassLoader().getResourceAsStream("myfile.txt") und String.class.getClassLoader().getResourceAsStream("/myfile.txt") aufrufen, wird in beiden Fällen im Klassenpfad an der folgenden Stelle nach einer Datei gesucht: ./myfile.txt.
Immer wenn ich in diesem Beitrag einen Speicherort erwähne, kann es sich um einen Speicherort im Dateisystem selbst oder in der entsprechenden JAR-Datei handeln, abhängig von der Klasse und/oder dem ClassLoader, von dem Sie die Ressource laden.
In Ihrem Fall laden Sie die Klasse von einem Anwendungsserver, daher sollten Sie Thread.currentThread().getContextClassLoader().getResourceAsStream(dateiname) anstelle von this.getClass().getClassLoader().getResourceAsStream(dateiname) verwenden. this.getClass().getResourceAsStream() funktioniert auch.
Lesen Sie diesen Artikel, um weitere Informationen zu diesem speziellen Problem zu erhalten.
Hinweis für Benutzer von Tomcat 7 und darunter
In eine der Antworten auf diese Frage heißt es, dass meine Erklärung für Tomcat 7 anscheinend falsch sei. Ich habe versucht, herauszufinden, warum das so sein könnte.
Daher habe ich mir den Quellcode von Tomcats WebAppClassLoader für verschiedene Tomcat-Versionen angesehen. Die Implementierung von findResource(String name) (die letztendlich für die URL zur angeforderten Ressource verantwortlich ist) ist in Tomcat 6 und Tomcat 7 nahezu identisch, in Tomcat 8 jedoch anders.
In den Versionen 6 und 7 versucht die Implementierung nicht, den Ressourcennamen zu normalisieren. Dies bedeutet, dass in diesen Versionen classLoader.getResourceAsStream("/resource.txt") möglicherweise nicht das gleiche Ergebnis liefert wie classLoader.getResourceAsStream("resource.txt"), obwohl dies der Fall sein sollte (wie in der Javadoc angegeben). [Quellcode]
In Version 8 wird der Ressourcenname jedoch normalisiert, um zu gewährleisten, dass die absolute Version des Ressourcennamens verwendet wird. Daher sollten die beiden oben beschriebenen Aufrufe in Tomcat 8 immer das gleiche Ergebnis liefern. [Quellcode]
Daher müssen Sie bei der Verwendung von ClassLoader.getResourceAsStream() oder Class.getResourceAsStream() auf Tomcat-Versionen vor 8 besonders vorsichtig sein. Und Sie müssen auch bedenken, dass class.getResourceAsStream("/resource.txt") tatsächlich classLoader.getResourceAsStream("resource.txt") aufruft (der führende / wird entfernt).
Das obige ist der detaillierte Inhalt vonWie unterscheiden sich „ClassLoader.getResourceAsStream()' und „Class.getResourceAsStream()' beim Laden von Dateien als InputStreams?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!