117 votes

Comment puis-je obtenir mon répertoire de travail actuel en Java ?

Disons que j'ai ma classe principale dans C:\Users\Justian\Documents.

Comment puis-je obtenir mon programme pour montrer que c'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 faire un dump d'un tas de fichiers CSV dans un dossier, le programme de reconnaître tous les fichiers, puis de charger les données et les manipuler. Vraiment, je veux juste savoir comment naviguer dans ce dossier.

Merci beaucoup,

Justian

Je veux faire un dump d'un tas de fichiers CSV dans un dossier, le programme de reconnaître tous les fichiers, puis de charger les données et les manipuler. Vraiment, je veux juste savoir comment naviguer dans ce dossier.

@BalusC

Pourquoi:

public static String getCleanPath() {
    ClassLoader classLoader = ExcelFile.class.getClassLoader();
    File classpathRoot = new File(classLoader.getResource("").getPath());

    return classpathRoot.getPath();
}

Mieux que:

public static String getCleanPath() {
    URL location = ExcelFile.class.getProtectionDomain().getCodeSource()
            .getLocation();
    String path = location.getFile();

    return new File(path).getParent();
}

155voto

Jarrod Roberson Points 32263

Un autre moyen serait d'utiliser le système de propriété System.getProperty("user.dir"); cela vous donnera "Le répertoire de travail en cours lorsque les propriétés ont été initialisé". C'est probablement ce que vous voulez. pour savoir où l' java commande a été émise, dans votre cas, dans le répertoire contenant les fichiers à traiter, même si le réel .fichier jar peut se trouver quelque part sur la machine. Avoir le répertoire de la réelle .fichier jar n'est pas très utile dans la plupart des cas.

Le suivant va imprimer le répertoire courant à partir duquel la commande a été invoqué indépendamment de l'endroit où l' .de la classe ou de .fichier jar le .fichier de classe.

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 en /User/me/ et votre .fichier jar contenant le code ci-dessus est en /opt/some/nested/dir/ la commande java -jar /opt/some/nested/dir/test.jar Test sortie current dir = /User/me.

Vous devez également comme un bonus de look à l'aide d'un bon orientées objet en argument de ligne de commande de l'analyseur. Je recommande fortement JSAP, la Java Simple Argument de l'Analyseur. Ce serait vous permettent d'utiliser System.getProperty("user.dir") et, subsidiairement, de passer à autre chose pour l'emporter sur le comportement. Beaucoup plus facile à gérer solution. Cela permettrait de faire passer dans le répertoire de processus très facile à faire, et être en mesure de se rabattre sur d' user.dir si rien ne s'était passé.

78voto

BalusC Points 498232

Utiliser CodeSource#getLocation(). Cela fonctionne bien dans les fichiers JAR. Vous pouvez obtenir de l' CodeSource par ProtectionDomain#getCodeSource() et de la ProtectionDomain peut être obtenue en 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());
    }
}

Mise à jour selon le commentaire de l'OP:

Je veux faire un dump d'un tas de fichiers CSV dans un dossier, le programme de reconnaître tous les fichiers, puis de charger les données et les manipuler. Vraiment, je veux juste savoir comment naviguer dans ce dossier.

Qui exigerait de coder en dur/sachant que leur chemin relatif dans votre programme. Plutôt envisager d'ajouter son chemin vers le chemin de la classe, de sorte que vous pouvez 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 de passer son chemin comme main() argument.

32voto

cyber-monk Points 2597
<pre><code></code><p>Imprime quelque chose comme :</p><pre><code></code></pre><p><code></code>lève qu'une exception IOException vérifiée, mais il va supprimer des choses comme <code></code></p></pre>

14voto

Neomusashi Points 329
this.getClass().getClassLoader().getResource("").getPath()

5voto

jmamatos Points 21

Si vous souhaitez que le chemin d’accès absolu du code source actuel, ma suggestion est :

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