


En quoi `ClassLoader.getResourceAsStream()` et `Class.getResourceAsStream()` diffèrent-ils lors du chargement de fichiers en tant qu'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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...
