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.
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.
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.
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();
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();
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".
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.
J'ai trouvé cette solution dans les commentaires qui est meilleure que d'autres et plus portable:
String cwd = new File("").getAbsolutePath();
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());
}
}
this.getClass().getClassLoader().getResource("").getPath()
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()
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"));
}
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.
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.
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")
...
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!
;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
ou ()%&$%^@#
cela fonctionne bien.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;
}
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.
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,
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()