Moyen privilégié de chargement des ressources en Java
Je voudrais savoir le meilleur moyen de chargement d'une ressource en Java:
this.getClass().getResource() (or getResourceAsStream())
,Thread.currentThread().getContextClassLoader().getResource(name)
,System.class.getResource(name)
.
Vous devez vous connecter pour publier un commentaire.
De travail de la solution en fonction de ce que vous voulez...
Il y a deux choses que
getResource
/getResourceAsStream()
aurez à partir de la classe, il est appelé sur...Donc, si vous ne
il va tenter de charger foo.txt à partir de la même formule que le "il" de la classe et avec le chargeur de classe de la "ce" de la classe. Si vous mettez un "/" devant alors vous êtes absolument référencer la ressource.
va charger la ressource à partir de la classe loader de "ce" et de la "x".y.z paquet (il devra être dans le même répertoire que les classes de ce package).
sera chargé avec le contexte de la classe loader, mais ne permettra pas de résoudre le nom selon l'une quelconque paquet (il doit être absolument référencé)
Va charger la ressource avec le système de chargeur de classe (il devrait être absolument référencé en tant que bien, car vous ne serez pas en mesure de mettre n'importe quoi dans le java.lang package (le package de Système).
Il suffit de prendre un coup d'oeil à la source. Indique également que getResourceAsStream appelle simplement "openStream" sur l'URL renvoyée à partir de getResource et des rendements.
Thread#setContextClassLoader
. Ceci est utile si vous devez modifier le chemin de classe, tandis que le programme est en cours d'exécution.Bien, en partie dépend de ce que vous voulez faire si vous êtes fait dans une classe dérivée.
Par exemple, supposons que
SuperClass
est dans A.jar etSubClass
est dans B.jar et vous êtes à l'exécution de code dans une méthode d'instance a déclaré dansSuperClass
mais oùthis
fait référence à une instance deSubClass
. Si vous utilisezthis.getClass().getResource()
il va chercher par rapport àSubClass
, dans B.jar. Je pense que c'est généralement pas ce qui est nécessaire.Personnellement, je serais probablement utiliser
Foo.class.getResourceAsStream(name)
le plus souvent - si vous connaissez déjà le nom de la ressource que vous êtes après, et vous êtes sûr de l'endroit où elle est relative àFoo
, c'est le plus robuste de la façon de faire de l'OMI.Bien sûr il y a des moments où c'est pas ce que vous voulez: juger chaque cas selon ses mérites. C'est juste le "je sais que cette ressource est livré avec cette classe" est la plus commune que j'ai pu croiser.
this.getClass()
. Créer une instance de la sous-classe et l'appel à la méthode... ça va imprimer le nom de la sous-classe, pas la super-classe.Je recherche trois endroits comme indiqué ci-dessous. Commentaires bienvenus.
Je sais que ce vraiment la fin pour une autre réponse, mais je voulais juste partager ce qui m'a aidé à la fin. Il sera aussi charger des ressources/fichiers à partir du chemin d'accès absolu du système de fichier (pas seulement le classpath).
J'ai essayé beaucoup de moyens et fonctions que suggéré ci-dessus, mais ils n'ont pas de travail dans mon projet. De toute façon j'ai trouvé la solution et c'est ici:
this.getClass().getResourceAsStream()
dans ce cas. Si vous obtenez un coup d'oeil à la source de lagetResourceAsStream
méthode, vous remarquerez qu'il fait la même chose que vous, mais de façon plus intelligente (de secours si aucuneClassLoader
peut être trouvé sur la classe). Il indique également que vous pouvez rencontrer un potentielnull
surgetClassLoader
dans votre code ...this.getClass().getResourceAsStream()
ne fonctionne pas pour moi, donc j'utilise et qui fonctionne. Je pense qu'il y a certaines personnes qui peut faire face à un problème comme le mien.