Maison > Java > javaDidacticiel > En quoi `ClassLoader.getResourceAsStream()` et `Class.getResourceAsStream()` diffèrent-ils lors du chargement de fichiers en tant qu'InputStreams ?

En quoi `ClassLoader.getResourceAsStream()` et `Class.getResourceAsStream()` diffèrent-ils lors du chargement de fichiers en tant qu'InputStreams ?

Linda Hamilton
Libérer: 2024-12-23 17:21:15
original
691 Les gens l'ont consulté

How Do `ClassLoader.getResourceAsStream()` and `Class.getResourceAsStream()` Differ When Loading Files as InputStreams?

différentes façons de charger un fichier en tant que InputStream

Il existe des différences subtiles dans l'interprétation du nom de fichier transmis. Fondamentalement, il existe deux méthodes différentes : ClassLoader.getResourceAsStream() et Class.getResourceAsStream(). Ces deux méthodes trouvent la ressource de différentes manières.

Dans Class.getResourceAsStream(path), le chemin est interprété comme un chemin dans le package de la classe à partir de laquelle vous l'appelez. Par exemple, l'appel de String.class.getResourceAsStream("myfile.txt") recherchera un fichier dans votre chemin de classe à l'emplacement suivant : "java/lang/myfile.txt". Si votre chemin commence par un /, il sera considéré comme un chemin absolu et la recherche démarrera à la racine du classpath. Ainsi, lorsque vous appelez String.class.getResourceAsStream("/myfile.txt"), il examine l'emplacement suivant dans le chemin de classe : ./myfile.txt.

ClassLoader.getResourceAsStream(path) considère tous les chemins comme Chemins absolus. Donc, si vous appelez String.class.getClassLoader().getResourceAsStream("myfile.txt") et String.class.getClassLoader().getResourceAsStream("/myfile.txt"), dans les deux cas, ce sera dans le chemin de classe au emplacement suivant recherchant un fichier : ./myfile.txt.

Chaque fois que je mentionne un emplacement dans cet article, il se peut que ce soit celui-là Emplacement dans le système de fichiers lui-même ou dans le fichier JAR correspondant, selon la classe et/ou ClassLoader à partir duquel vous chargez la ressource.

Dans votre cas, vous chargez la classe depuis un serveur d'application, donc vous devez utiliser Thread.currentThread().getContextClassLoader().getResourceAsStream(filename) au lieu de this.getClass().getClassLoader().getResourceAsStream(filename). this.getClass().getResourceAsStream() fonctionne également.

Lisez cet article pour plus d'informations sur ce problème spécifique.

Remarque pour les utilisateurs de Tomcat 7 et versions antérieures

L'une des réponses à cette question indique que mon explication pour Tomcat 7 semble incorrecte. J'essayais de comprendre pourquoi cela pourrait être le cas.

J'ai donc regardé le code source du WebAppClassLoader de Tomcat pour différentes versions de Tomcat. L'implémentation de findResource(String name) (qui est en fin de compte responsable de l'URL de la ressource demandée) est presque identique dans Tomcat 6 et Tomcat 7, mais différente dans Tomcat 8.

Dans les versions 6 et 7, l'implémentation ne tente pas de normaliser le nom de la ressource. Cela signifie que dans ces versions, classLoader.getResourceAsStream("/resource.txt") peut ne pas donner le même résultat que classLoader.getResourceAsStream("resource.txt"), même s'il le devrait (comme indiqué dans la Javadoc). [Code source]

Cependant, dans la version 8, le nom de la ressource est normalisé pour garantir que la version absolue du nom de la ressource est utilisée. Par conséquent, les deux appels décrits ci-dessus devraient toujours produire le même résultat dans Tomcat 8. [Code source]

Par conséquent, vous devez être très prudent lorsque vous utilisez ClassLoader.getResourceAsStream() ou Class.getResourceAsStream() sur les versions de Tomcat antérieures à 8. Et vous devez également garder à l'esprit que class.getResourceAsStream("/resource.txt") appelle en fait classLoader.getResourceAsStream("resource.txt") (le premier / est supprimé).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal