Maison >Java >javaDidacticiel >Introduction à l'utilisation de getResourceAsStream en Java

Introduction à l'utilisation de getResourceAsStream en Java

零下一度
零下一度original
2017-07-18 18:04:182972parcourir

Utiliser JAVA pour obtenir des fichiers peut sembler simple, mais pour de nombreux nouveaux arrivants comme moi, la maîtrise est encore assez superficielle et l'expérience de son utilisation est assez profonde. La méthode la plus couramment utilisée consiste à utiliser la classe File de JAVA. obtenez le fichier c:/test.txt, vous utiliserez File file = new File("c:/test.txt"); Quel est le problème avec cette utilisation? Je crois que tout le monde sait que le chemin est codé en dur. Dans l'esprit JAVA, l'application doit être créée une seule fois et disponible partout, et du point de vue pratique de l'application, l'application finale générée sera également déployée sur des systèmes d'exploitation autres que Windows. Pour Linux, utiliser les mots c:/ dans l'application signifie un échec. , nous devrions donc essayer d'éviter d'utiliser du codage en dur, c'est-à-dire d'utiliser directement des chemins absolus.

Dans l'application Servlet, il existe une méthode getRealPath(String str). Bien que cette méthode puisse également obtenir dynamiquement le chemin du fichier sans écrire directement à la main le chemin absolu, c'est également une méthode qui n'est pas recommandée. , Alors, quelle méthode avons-nous pour améliorer le fichier ?

Il s'agit des méthodes Class.getResource() et Class.getResourceAsStream(), mais beaucoup de gens ne comprennent toujours pas son utilisation, car beaucoup de gens (Par exemple, moi il n'y a pas longtemps) je ne savais pas quels paramètres devaient lui être transmis. Bien sûr, certaines personnes l'ont déjà très bien utilisé, et ces personnes n'ont pas besoin de s'en occuper. Ici, je ne fais que donner. vous avez des paramètres qui ne savent pas comment l'utiliser ou qui ne sont pas très bons dans ce domaine. Quelqu'un qui le connaît peut vous expliquer un peu.

Tout d'abord, il existe les types suivants de getResourceAsStream en Java :

1. Class.getResourceAsStream (String path) : lorsque le chemin ne commence pas par '/', il est par défaut le package où se trouve cette classe. Les ressources commençant par '/' sont obtenues à partir de la racine

 ClassPath. Il construit simplement un chemin absolu à travers le chemin, et finalement la ressource est obtenue par ClassLoader.

 2.Class.getClassLoader.getResourceAsStream(String path) : Par défaut, il est obtenu à partir de la racine ClassPath. Le chemin ne peut pas commencer par '/'. Enfin, la ressource est obtenue par

Chargeur de classe.

 3. ServletContext.getResourceAsStream(String path) : par défaut, les ressources sont récupérées à partir du répertoire racine de WebAPP. Peu importe que le chemin commence par '/' sous Tomcat. Bien sûr, cela est lié à l'implémentation spécifique du conteneur.

4. L'objet intégré à l'application sous Jsp est une implémentation du ServletContext ci-dessus.


Au fait, les chargeurs de classes en JAVA :

Il y a trois chargeurs au total

bootstrap classloader : responsable du chargement des classes de base JAVA ( jre Contenu dans les répertoires lib et class)

chargeur de classe d'extension : responsable du chargement des classes d'extension JAVA (contenu dans le répertoire lib/ext sous jre)
chargeur de classe système : responsable du chargement spécifié par l'application classes (le contenu configuré dans la variable d'environnement classpath)
L'ordre de chargement d'une classe est également basé sur l'arrangement ci-dessus, afin de garantir que la classe système peut être chargée en premier.

Dans le même temps, les utilisateurs peuvent également définir leur propre ClassLoader pour charger des ressources spéciales.

Cela implique la différence entre Class.getClassLoader() et Thread.currentThread.getContextClassLoader().

Donnez un exemple simple :

Supposons qu'un jour JAVA nous fournisse une classe appelée StartCamera pour démarrer la caméra standard de l'ordinateur, et emballe cette classe dans un pot.

Dans des circonstances normales, lorsque nous voulons démarrer la caméra, il nous suffit de configurer ce pot dans le chemin de classe. Le chargeur de classes système chargera cette classe dans l'application au démarrage du système.

Mais comme les fabricants de caméras sont différents, il y aura plusieurs implémentations différentes de StartCamera pour les nouveaux appareils dans l'application, nous ne savons pas laquelle les utilisateurs réels utiliseront. Nous avons donc personnalisé un ClassLoader pour charger la classe StartCamera correspondante pour un type d'appareil spécifique.

Cela apparaîtra ainsi : chargez d'abord les classes que nous avons définies, puis chargez celles du système si elles ne peuvent pas être chargées. Une telle demande ne peut pas être satisfaite par le

mécanisme de chargement des délégués parents

par défaut du système. Thread.currentThread.getContextClassLoader() est généré de cette manière. Nous utilisons Thread.currentThread.setContextClassLoader() pour spécifier le ClassLoader correspondant pour le thread actuel, puis utilisons la méthode get pour l'obtenir.

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!

Déclaration:
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