web-dev-qa-db-fra.com

Obtenir le répertoire de travail actuel dans Java

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

 String current = new Java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 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 actuel. Besoin d'aide à cet égard.

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

Ceci imprimera un chemin absolu complet à partir duquel votre application a été initialisée.

1062
Anuj Patel

Voir: http://docs.Oracle.com/javase/tutorial/essential/io/pathOps.html

En utilisant Java.nio.file.Path et Java.nio.file.Paths, vous pouvez procéder comme suit pour montrer ce que Java considère comme votre chemin actuel. Ceci pour 7 ans et plus, et utilise NIO.

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

Cette sortie Current relative path is: /Users/george/NetBeansProjects/Tutorials c'est dans ce cas que j'ai exécuté la classe. La construction de chemins de manière relative, en n'utilisant pas de séparateur de tête pour indiquer que vous construisez un chemin absolu, utilisera ce chemin relatif comme point de départ.

352
geoO

Ce qui suit fonctionne sur Java 7 et versions ultérieures (voir ici pour la documentation).

import Java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();
213
Dmitry Bespalov

Cela vous donnera le chemin de votre répertoire de travail actuel:

Path path = FileSystems.getDefault().getPath(".");

Et cela vous donnera le chemin vers un fichier appelé "Foo.txt" dans le répertoire de travail:

Path path = FileSystems.getDefault().getPath("Foo.txt");

Edit: Pour obtenir un chemin absolu du répertoire actuel:

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
56
Mark

C'est la solution pour moi

File currentDir = new File("");
33
user2430452

Qu'est-ce qui vous fait penser que c:\windows\system32 n'est pas votre répertoire actuel? La propriété user.dir doit explicitement être "Répertoire de travail actuel de l'utilisateur".

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

Edit : Il semble que cela ne soit vrai que pour les anciennes fenêtres et/ou Java versions.

30
Paul Wagland

J'ai trouvé cette solution dans les commentaires qui est meilleure que d'autres et plus portable:

String cwd = new File("").getAbsolutePath();
26
freedev

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());
    }
}
25
Amin Bahiraei
this.getClass().getClassLoader().getResource("").getPath()
23
Peter De Winter

généralement, en tant qu'objet File:

File getCwd() {
  return new File("").getAbsoluteFile();
}

vous voudrez peut-être avoir une chaîne qualifiée complète comme "D:/a/b/c"

getCwd().getAbsolutePath()
17
comeGetSome

Je suis sous Linux et j'obtiens le même résultat pour les deux approches suivantes:

@Test
public void aaa()
{
    System.err.println(Paths.get("").toAbsolutePath().toString());

    System.err.println(System.getProperty("user.dir"));
}

Paths.get("") docs

System.getProperty("user.dir") docs

12
Bohdan

Utilisation de Windows user.dir renvoie le répertoire comme prévu, mais PAS lorsque vous démarrez votre application avec des droits élevés (exécuter en tant qu'administrateur). Dans ce cas, vous obtenez C:\WINDOWS\system32.

5
SijeDeHaan

Sur Linux lorsque vous exécutez un fichier jar à partir de terminal, ils renverront le même String: "/ home/CurrentUser" , peu importe, où se trouve le fichier jar. Cela dépend du répertoire actuel que vous utilisez avec votre terminal lorsque vous démarrez le fichier jar.

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

System.getProperty("user.dir");

Si votre Class avec main s'appelle MainClass, essayez alors:

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

Cela retournera un String avec chemin absol du fichier jar.

4
Jan Povolný

Le répertoire de travail actuel est défini différemment dans différentes implémentations Java. Pour certaines versions antérieures à Java 7, il n'existait aucun moyen cohérent d'obtenir le répertoire de travail. Vous pouvez contourner ce problème en lançant le fichier Java avec -D et en définissant une variable pour contenir les informations.

Quelque chose comme

Java -D com.mycompany.workingDir="%0"

Ce n'est pas tout à fait vrai, mais vous voyez l'idée. Puis System.getProperty("com.mycompany.workingDir")...

4
MJB

Mentionnez qu'il est vérifié seulement dans Windows mais je pense que cela fonctionne parfaitement sur d'autres systèmes d'exploitation [Linux,MacOs,Solaris]:).


J'ai eu 2.jar fichiers dans le même répertoire. Je voulais que le fichier .jar démarre l'autre fichier .jar qui se trouve dans le même répertoire.

Le problème est que lorsque vous le démarrez à partir de cmd, le répertoire actuel est system32.


Avertissements!

  • Le texte ci-dessous semble bien fonctionner dans tous les tests que j'ai effectués même avec le nom de dossier ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() ou ()%&$%^@# cela fonctionne bien.
  • J'utilise la ProcessBuilder avec comme suit:

???? ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("Java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

???? getBasePathForClass(Class<?> classs):

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".Zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // fix to run inside Eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbeans
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    }
3
GOXR3PLUS

J'espère que vous souhaitez accéder au répertoire en cours, y compris au paquet i.e. Si votre programme Java est dans c:\myApp\com\foo\src\service\MyTest.Java et que vous souhaitez imprimer jusqu'à c:\myApp\com\foo\src\service, vous pouvez essayer le code suivant:

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("Sun.Java.command")
                    .substring(0, System.getProperty("Sun.Java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);

Remarque: Ce code est testé uniquement sous Windows avec Oracle JRE.

3
JSS

supposons que vous essayez d'exécuter votre projet dans Eclipse, Netbean ou de manière autonome à partir de la ligne de commande. J'ai écrit une méthode pour le réparer

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".Zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // fix to run inside Eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbean
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

Pour l'utiliser, partout où vous voulez obtenir le chemin de base pour lire le fichier, vous pouvez passer votre classe d'ancrage à la méthode ci-dessus, le résultat peut être ce dont vous avez besoin: D

Meilleur,

1
bachden

Aucune des réponses affichées ici n'a fonctionné pour moi. Voici ce qui a fonctionné:

Java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

Edit: La version finale dans mon code:

URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
Java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1) 
{}
return Java.nio.file.Paths.get(myURI).toFile().toString()
0
VenerableAgents