1368 votes

Comment obtenir le répertoire de travail actuel en Java ?

Je veux accéder à mon répertoire de travail actuel en utilisant Java.

Mon code :

 String currentPath = new java.io.File(".").getCanonicalPath();
 System.out.println("Current dir:" + currentPath);

 String currentDir = System.getProperty("user.dir");
 System.out.println("Current dir using System:" + currentDir);

Sortie :

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

Ma sortie n'est pas correcte car le lecteur C n'est pas mon répertoire courant.

Comment obtenir le répertoire courant ?

2 votes

Pouvez-vous coller ici ce que vous voyez lorsque vous exécutez cd sur votre invite de commande lorsque vous exécutez ceci ?

3 votes

Qu'est-ce que vous essayez d'accomplir en accédant au répertoire de travail ? Pourrait-on le faire en utilisant le chemin des classes à la place ? Par exemple, si vous devez lire un fichier texte sur le système de fichiers, vous pouvez le trouver facilement s'il se trouve dans le chemin des classes.

1 votes

Comment ? Pouvez-vous nous en dire plus ?

1492voto

indyaah Points 4006

Code :

public class JavaApplication {
  public static void main(String[] args) {
    System.out.println("Working Directory = " + System.getProperty("user.dir"));
  }
}

Ceci imprimera le chemin absolu du répertoire actuel à partir duquel votre application a été initialisée.


Explication :

De la documentation :

java.io Le paquet résout les noms de chemin relatifs en utilisant le répertoire courant de l'utilisateur. Le répertoire courant est représenté comme une propriété du système, c'est-à-dire, user.dir et est le répertoire à partir duquel la JVM a été invoquée.

29 votes

@ubuntudroid : c'est pourquoi j'ai mentionné spécifiquement qu'il imprimera le chemin à partir duquel l'application a été initialisée. Je suppose que le démarreur du fil exécute directement le jar/programme après le démarrage de l'invite commnad (qui est essentiellement à C:\WINDOWS\system32 ). J'espère que vous comprenez ce que je veux dire. En supposant que vous ayez rétrogradé, j'apprécie qu'au moins vous ayez pris le soin de laisser une réponse :)

2 votes

User.dir obtiendra le chemin vers le dossier dans lequel le processus a été lancé. Pour obtenir le chemin réel du dossier principal de l'application, voir ma réponse ci-dessous.

0 votes

Le problème avec la propriété "user.dir" est que, dès que quelqu'un la passe en tant que -Duser.dir=... ou le définir dans le code avec System.setProperty("user.dir", ...) tout le code qui s'appuie sur elle échoue.

538voto

geoO Points 767

Voir : Opérations sur les chemins (The Java™ Tutorials > Essential Classes > Basic I/O) .

Utilisation de java.nio.file.Path et java.nio.file.Paths vous pouvez faire ce qui suit pour montrer ce que Java pense être votre chemin actuel. Ceci pour les versions 7 et suivantes, et utilise NIO.

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current absolute path is: " + s);

Ces sorties :

Current relative path is: /Users/george/NetBeansProjects/Tutorials

qui dans mon cas est l'endroit d'où j'ai lancé la classe.

Si vous construisez des chemins de manière relative, sans utiliser de séparateur principal pour indiquer que vous construisez un chemin absolu, vous utiliserez ce chemin relatif comme point de départ.

3 votes

Le premier n'a pas été vérifié, mais le second récupère votre dossier personnel. Pas le répertoire de travail actuel dans lequel l'application est exécutée.

20 votes

Ne confondez pas le répertoire d'origine de l'utilisateur ("user.home", /Users/george dans votre cas) et le répertoire de travail actuel ("user.dir", qui sera le répertoire à partir duquel vous avez lancé la JVM pour votre application, et qui pourrait donc être quelque chose comme /Users/george/workspace/FooBarProject).

3 votes

Je préfère cette méthode. Quand j'ai besoin du parent du répertoire de travail, cela fait pas travail : Paths.get("").getParent() on obtient null . Au lieu de cela, ceci fonctionne : Paths.get("").toAbsolutePath().getParent() .

261voto

Dmitry Bespalov Points 715

Ce qui suit fonctionne sur Java 7 et plus (voir ici pour la documentation).

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();

11 votes

En quoi est-ce mieux que le plus portable import java.io.File; File(".").getAbsolutePath() ?

9 votes

Quand vous dites portable, vous voulez dire qu'il fonctionne avec Java 6 et les versions antérieures ? Paths.get() peut être considéré comme meilleur dans la mesure où il donne un accès direct au plus puissant Path interface.

11 votes

Quel est l'avantage potentiel d'utiliser .normalize() dans ce contexte ?

38voto

user2430452 Points 99

Voici la solution pour moi

File currentDir = new File("");

2 votes

Cela a des effets secondaires lorsque vous utilisez un tel objet File comme parent d'un autre File : new File(new File(""), "subdir") ne fonctionnera pas comme prévu.

17 votes

Pour corriger cela, utilisez new File("").getAbsoluteFile() à la place.

5 votes

Pour ce que ça vaut, j'ai eu plus de chance avec File(".").

30voto

Paul Wagland Points 10487

Qu'est-ce qui vous fait penser que c : \windows\system32 n'est pas votre répertoire actuel ? Le site [user.dir](http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#getProperties()) est explicitement définie comme étant "le répertoire de travail actuel de l'utilisateur".

En d'autres termes, à moins que vous ne lanciez Java depuis la ligne de commande, c : \windows\system32 est probablement votre CWD. En d'autres termes, si vous double-cliquez pour lancer votre programme, il est peu probable que le CWD soit le répertoire à partir duquel vous double-cliquez.

Modifier : Il semble que cela ne soit vrai que pour les anciennes versions de Windows et/ou de Java.

3 votes

Cela ne semble pas être le cas, du moins pas sur ma machine Windows 7 utilisant Java 7. user.dir est systématiquement le dossier où j'ai double-cliqué sur le fichier jar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X