2010-05-26 3 views

Répondre

11

Vous pouvez utiliser CodeSource#getLocation() pour cela. Le CodeSource est disponible par ProtectionDomain#getCodeSource(). Le ProtectionDomain à son tour est disponible par Class#getProtectionDomain().

URL location = getClass().getProtectionDomain().getCodeSource().getLocation(); 
File file = new File(location.getPath()); 
// ... 

Ce retourne l'emplacement exact de la Class en question.

Mise à jour: selon les commentaires, il est apparemment déjà dans le classpath. Vous pouvez ensuite utiliser ClassLoader#getResource() dans lequel vous passez le chemin relatif au package racine.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = classLoader.getResource("filename.ext"); 
File file = new File(resource.getPath()); 
// ... 

Vous pouvez même obtenir comme un InputStream en utilisant ClassLoader#getResourceAsStream().

InputStream input = classLoader.getResourceAsStream("filename.ext"); 
// ... 

C'est également la manière normale d'utiliser des ressources empaquetées. Si elle se trouve à l'intérieur d'un paquet, utilisez par exemple com/example/filename.ext à la place.

+1

+1, mais notez que P rotectionDomain.getCodeSource() et CodeSource.getLocation() peuvent tous deux être NULL. –

+0

@bkail: Il peut en effet renvoyer une valeur nulle lorsqu'il est chargé à l'aide d'un classloader mal conçu, ou lorsqu'il est chargé à partir d'une source de flux externe, etc. Ceci ne s'applique généralement pas aux programmes Java "concrets" avec un main() '. – BalusC

+0

Cela fait vraiment le travail - mais il ne semble pas très agréable. Ce que je dois faire est de charger un fichier de configuration qui doit être dans le même dossier que mon jar, mais peut être exécuté à partir de n'importe quel emplacement. Est-ce la bonne façon d'obtenir les informations sur l'emplacement du fichier? – markovuksanovic

-1

si vous voulez obtenir le « répertoire de travail » pour le programme en cours d'exécution, puis il suffit d'utiliser:

new File(""); 
+2

Le répertoire de travail n'est pas nécessairement l'emplacement du programme. – Douglas

Questions connexes