Pour obtenir l' File
, pour un Class
, il y a deux étapes:
- Convertir l'
Class
d'un URL
- Convertir l'
URL
d'un File
Il est important de comprendre à la fois des mesures, et non pas l'amalgame entre eux.
Une fois que vous avez l' File
, vous pouvez appeler getParentFile
pour obtenir le dossier contenant, si c'est ce que vous avez besoin.
Étape 1: Class
de URL
Comme discuté dans d'autres réponses, il y a deux grandes façons de trouver un URL
pertinent pour un Class
.
URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();
URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");
Les deux ont des avantages et des inconvénients.
L' getProtectionDomain
approche donne l'emplacement de la base de la classe (par exemple, le fichier JAR contenant). Toutefois, il est possible que le runtime Java de la politique de sécurité de jeter SecurityException
lors de l'appel d' getProtectionDomain()
, donc si votre application a besoin pour fonctionner dans une variété d'environnements, il est préférable de le tester dans tous les d'entre eux.
L' getResource
approche donne l'URL complète chemin d'accès aux ressources de la classe, à partir de laquelle vous devrez effectuer supplémentaires de manipulation de chaîne. Il peut être un file:
chemin, mais il pourrait aussi être jar:file:
ou même quelque chose de plus méchant comme bundleresource://346.fwk2106232034:4/foo/Bar.class
lors de l'exécution à l'intérieur d'un framework OSGi. À l'inverse, l' getProtectionDomain
approche correctement donne un file:
URL de même à partir d'OSGi.
Notez que les deux getResource("")
et getResource(".")
a échoué dans mes tests, lorsque la classe se trouvaient à l'intérieur d'un fichier JAR; les deux invocations retourné null. Je recommande donc le n ° 2 de l'invocation indiqué ci-dessus au lieu de cela, comme il semble plus sûr.
Étape 2: URL
de File
De toute façon, une fois que vous avez un URL
, la prochaine étape est de les convertir à un File
. C'est son propre défi; voir kohsuke nous Kawaguchi blog post à ce sujet pour plus de détails, mais en bref, vous pouvez utiliser new File(url.toURI())
tant que l'URL est complètement bien formé.
Enfin, je voudrais décourage fortement l'aide d' URLDecoder
. Certains caractères de l'URL, :
et /
en particulier, ne sont pas valides URL caractères encodés. À partir de la URLDecoder Javadoc:
Il est supposé que tous les caractères de la chaîne codée est l'un des suivants: "a" à "z", "A" à "Z", "0" à "9", et "-", "_", ".", et "*". Le caractère "%" est autorisée, mais est interprété comme le début d'une échappé à la séquence.
...
Il y a deux façons possibles de ce décodeur peut traiter illégale des chaînes de caractères. Il pourrait laisser des caractères illégaux seul, ou qu'il pourrait jeter une IllegalArgumentException. Qui approche le décodeur prend est laissé à la mise en œuvre.
Dans la pratique, URLDecoder
généralement ne pas jeter IllegalArgumentException
menacées ci-dessus. Et si votre chemin d'accès de fichier avec des espaces encodé %20
, cette approche peut sembler fonctionner. Toutefois, si votre chemin d'accès du fichier à d'autres fins non alphameric des caractères tels que +
vous avez des problèmes avec l' URLDecoder
d'amputation votre chemin d'accès au fichier.