Obtenir le répertoire de travail actuel en Java

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

Ssortingng current = new java.io.File( "." ).getCanonicalPath(); System.out.println("Current dir:"+current); Ssortingng 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.

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

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

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

En utilisant 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 7 et plus, et utilise NIO.

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

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

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

 import java.nio.file.Paths; Paths.get(".").toAbsolutePath().normalize().toSsortingng(); 

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 depuis la racine du système de fichiers:

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

C’est la solution pour moi

 File currentDir = new File(""); 

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”.

Pour le dire autrement, à 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 CWD soit le répertoire à partir duquel vous double-cliquez.

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

 this.getClass().getClassLoader().getResource("").getPath() 

Utilisez CodeSource#getLocation() .

Cela fonctionne bien dans les fichiers JAR. Vous pouvez obtenir CodeSource par ProtectionDomain#getCodeSource() et la ProtectionDomain peut être obtenue à son tour par Class#getProtectionDomain() .

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

généralement comme object File:

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

vous souhaiterez peut-être avoir une chaîne qualifiée complète comme “D: / a / b / c” faisant:

 getCwd().getAbsolutePath() 

Je suis sous Linux et j’obtiens le même résultat pour ces deux approches:

 @Test public void aaa() { System.err.println(Paths.get("").toAbsolutePath().toSsortingng()); System.err.println(System.getProperty("user.dir")); } 

Paths.get("") docs

System.getProperty("user.dir") docs

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 aucune méthode cohérente pour obtenir le répertoire de travail. Vous pouvez contourner ce problème en lançant un fichier Java avec -D et en définissant une variable contenant les informations.

Quelque chose comme

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

Ce n’est pas tout à fait raison, mais vous avez l’idée. Ensuite, System.getProperty("com.mycompany.workingDir")

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

 Ssortingng cwd = new File("").getAbsolutePath(); 

J’espère que vous voulez accéder au répertoire en cours, y compris le paquet, c’est-à-dire si votre programme Java est dans c:\myApp\com\foo\src\service\MyTest.java et que vous voulez imprimer c:\myApp\com\foo\src\service alors vous pouvez essayer le code suivant:

 Ssortingng myCurrentDir = System.getProperty("user.dir") + File.separator + System.getProperty("sun.java.command") .subssortingng(0, System.getProperty("sun.java.command").lastIndexOf(".")) .replace(".", File.separator); System.out.println(myCurrentDir); 

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

Sous Linux, lorsque vous exécutez un fichier JAR depuis un terminal , ces deux éléments renvoient la même Ssortingng : “/ home / CurrentUser” , peu importe où se trouve votre fichier jar. Cela dépend juste de quel répertoire actuel utilisez-vous avec votre terminal, lorsque vous démarrez le fichier jar.

 Paths.get("").toAbsolutePath().toSsortingng(); System.getProperty("user.dir"); 

Si votre Class avec main s’appellerait MainClass , alors essayez:

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

Cela retournera une Ssortingng avec le chemin absolu du fichier jar .

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

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


J’ai eu 2 fichiers .jar dans le même répertoire. Je voulais à partir de l’un des fichiers .jar démarrer l’autre fichier .jar qui se trouve dans le même répertoire.

Le problème est que lorsque vous le lancez depuis le cmd le répertoire en cours est system32 .


Avertissements!

  • Le ci-dessous semble fonctionner assez bien dans tout le test que j’ai fait même avec le nom du dossier ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() ou ()%&$%^@# ça marche bien.
  • J’utilise le ProcessBuilder avec les éléments suivants comme suit:

🍂 ..

 //The class from which i called this was the class `Main` Ssortingng path = getBasePathForClass(Main.class); Ssortingng 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 Ssortingng getBasePathForClass(Class classs) { // Local variables File file; Ssortingng 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? // Ssortingng 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.subssortingng(0, basePath.length() - 4); } // fix to run inside netbeans if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) { basePath = basePath.subssortingng(0, basePath.length() - 14); } // end fix if (!basePath.endsWith(File.separator)) { basePath = basePath + File.separator; } return basePath; } 

Aucune des réponses posté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 de 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().toSsortingng() 

Supposons que vous essayiez d’exécuter votre projet dans eclipse, netbean ou autonome depuis la ligne de commande. J’ai écrit une méthode pour le réparer

 public static final Ssortingng getBasePathForClass(Class clazz) { File file; try { Ssortingng 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.subssortingng(0, basePath.length() - 4); } // fix to run inside netbean if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) { basePath = basePath.subssortingng(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 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,

c’est le nom du répertoire courant

 Ssortingng path="/home/prasad/Desktop/folderName"; File folder = new File(path); Ssortingng folderName=folder.getAbsoluteFile().getName(); 

c’est le chemin du répertoire courant

 Ssortingng path=folder.getPath(); 

System.getProperty("java.class.path")