web-dev-qa-db-fra.com

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

Disons que j'ai ma classe principale dans C:\Users\Justian\Documents\. Comment puis-je obtenir que mon programme montre qu'il est dans C:\Users\Justian\Documents?

Le codage en dur n'est pas une option - il doit être adaptable s'il est déplacé vers un autre emplacement.

Je veux vider un tas de fichiers CSV dans un dossier, faire en sorte que le programme reconnaisse tous les fichiers, puis charger les données et les manipuler. Je veux vraiment savoir comment naviguer dans ce dossier.

109
Justian Meyer

Une solution consisterait à utiliser propriété systèmeSystem.getProperty("user.dir");, ce qui vous donnera "le répertoire de travail en cours lors de l'initialisation des propriétés". C'est probablement ce que tu veux. pour savoir où la commande Java a été émise, dans votre cas, dans le répertoire contenant les fichiers à traiter, même si le fichier .jar réel peut résider ailleurs sur la machine. Avoir le répertoire du fichier .jar n'est pas très utile dans la plupart des cas.

Ce qui suit imprimera le répertoire actuel à partir duquel la commande a été appelée, quel que soit le fichier .class ou .jar dans lequel se trouve le fichier .class.

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

si vous êtes dans /User/me/ et que votre fichier .jar contenant le code ci-dessus se trouve dans /opt/some/nested/dir/, la commande Java -jar /opt/some/nested/dir/test.jar Test affichera current dir = /User/me.

Vous devriez également, en prime, utiliser un bon analyseur d'arguments en ligne de commande orienté objet. Je recommande fortement JSAP , le Java Simple Argument Parser. Cela vous permettrait d'utiliser System.getProperty("user.dir") et de passer quelque chose d'autre pour annuler le comportement. Une solution beaucoup plus facile à gérer. Cela rendrait très facile le passage dans le répertoire et le recours à user.dir si rien n'était passé.

140
user177800

Utilisez CodeSource#getLocation() . Cela fonctionne aussi bien dans les fichiers JAR. Vous pouvez obtenir CodeSource avec ProtectionDomain#getCodeSource() et le ProtectionDomain à son tour peut être obtenu avec Class#getProtectionDomain() .

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

Mettre à jour conformément au commentaire de l'OP:

Je souhaite vider un tas de fichiers CSV dans un dossier, faire en sorte que le programme reconnaisse tous les fichiers, puis charge les données et les manipule. Je veux vraiment savoir comment naviguer dans ce dossier.

Cela nécessiterait de coder en dur/connaître leur chemin relatif dans votre programme. Pensez plutôt à ajouter son chemin au classpath pour pouvoir utiliser ClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
    @Override public boolean accept(File dir, String name) {
        return name.endsWith(".csv");
    }
});

Ou pour passer son chemin comme argument main().

73
BalusC
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

Imprime quelque chose comme:

/path/to/current/directory
/path/to/current/directory/.

Notez que File.getCanonicalPath() lève une exception IOException vérifiée mais supprime des choses comme ../../../

31
cyber-monk
this.getClass().getClassLoader().getResource("").getPath()
13
Peter De Winter

Je viens d'utiliser:

import Java.nio.file.Path;
import Java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();
5
user3696181

Si vous voulez le chemin absolu du code source actuel, ma suggestion est la suivante:

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));
4
jmamatos

Si vous voulez obtenir votre répertoire de travail actuel, utilisez la ligne suivante

System.out.println(new File("").getAbsolutePath());
3
rjrajsaha

Qui a dit que votre classe principale est dans un fichier sur un disque dur local? Les classes sont plus souvent regroupées dans des fichiers JAR et parfois chargées sur le réseau, voire générées à la volée.

Alors qu'est-ce que vous voulez réellement faire? Il y a probablement une façon de le faire qui ne présuppose pas l'origine des classes.

3
Michael Borgwardt