1281 Stimmen

Wie erhalte ich das aktuelle Arbeitsverzeichnis in Java?

Ich möchte mein aktuelles Arbeitsverzeichnis mit Java zugreifen.

Mein Code:

 String currentPath = new java.io.File(".").getCanonicalPath();
 System.out.println("Aktuelles Verzeichnis:" + currentPath);

 String currentDir = System.getProperty("user.dir");
 System.out.println("Aktuelles Verzeichnis mit System:" + currentDir);

Ausgabe:

Aktuelles Verzeichnis: C:\WINDOWS\system32
Aktuelles Verzeichnis mit System: C:\WINDOWS\system32

Meine Ausgabe ist nicht korrekt, da das Laufwerk C nicht mein aktuelles Verzeichnis ist.

Wie kann man das aktuelle Verzeichnis bekommen?

15voto

Bohdan Punkte 14977

Ich bin auf Linux und erhalte das gleiche Ergebnis für beide Ansätze:

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

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

Paths.get("") Dokumentation

System.getProperty("user.dir") Dokumentation

7voto

JSS Punkte 1925

Ich hoffe, Sie möchten auf das aktuelle Verzeichnis einschließlich des Pakets zugreifen, d.h. Wenn Ihr Java-Programm in c:\myApp\com\foo\src\service\MyTest.java liegt und Sie bis c:\myApp\com\foo\src\service ausdrucken möchten, können Sie den folgenden Code ausprobieren:

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);

Hinweis: Dieser Code wurde nur unter Windows mit Oracle JRE getestet.

5voto

Jan Povolný Punkte 59

Wenn Sie auf Linux eine jar-Datei von Terminal ausführen, wird dies beide den gleichen String zurückgeben: "/home/CurrentUser", egal, wo sich Ihre jar-Datei befindet. Es hängt nur davon ab, welches aktuelle Verzeichnis Sie mit Ihrem Terminal verwenden, wenn Sie die jar-Datei starten.

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

System.getProperty("user.dir");

Wenn Ihre Klasse mit main MainClass genannt wird, versuchen Sie:

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

Dies wird einen String mit dem absoluten Pfad der jar-Datei zurückgeben.

5voto

SijeDeHaan Punkte 175

Wenn Sie Windows benutzen, gibt user.dir das erwartete Verzeichnis zurück, aber NICHT, wenn Sie Ihre Anwendung mit erhöhten Rechten starten (als Administrator ausführen), in diesem Fall erhalten Sie C:\WINDOWS\system32

4voto

GOXR3PLUS Punkte 6319

Erwähnen Sie, dass es nur in Windows überprüft wurde, aber ich denke, dass es auf anderen Betriebssystemen [Linux,MacOs,Solaris] perfekt funktioniert :).


Ich hatte 2 .jar Dateien im selben Verzeichnis. Ich wollte von der einen .jar Datei die andere .jar Datei starten, die sich im selben Verzeichnis befindet.

Das Problem ist, dass wenn Sie es vom cmd starten, das aktuelle Verzeichnis system32 ist.


Warnungen!

  • Das unten stehende scheint in all meinen Tests recht gut zu funktionieren, auch mit Ordnernamen wie ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() oder ()%&$%^@# funktioniert es gut.
  • Ich verwende den ProcessBuilder mit dem folgenden Code:

..

// Die Klasse, von der aus ich dies aufgerufen habe, war die Klasse `Main`
String path = getBasePathForClass(Main.class);
String applicationPath = new File(path + "application.jar").getAbsolutePath();

System.out.println("Verzeichnispfad ist: "+applicationPath);

// Ihr bekanntes Try-Catch hier
// Erwähnen Sie, dass es manchmal nicht funktioniert, zum Beispiel mit dem Ordner `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...Code

getBasePathForClass(Class classs):

    /**
     * Gibt den absoluten Pfad des aktuellen Verzeichnisses zurück, in dem die gegebene Klasse
     * Datei ist.
     * 
     * @param classs
     * @return Der absolute Pfad des aktuellen Verzeichnisses, in dem die Klassen
     *         Datei ist.
     * @author GOXR3PLUS[StackOverFlow-Benutzer] + bachden [StackOverFlow-Benutzer]
     */
    public static final String getBasePathForClass(Class classs) {

        // Lokale Variablen
        File file;
        String basePath = "";
        boolean failed = false;

        // Lass es uns zuerst versuchen
        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,
                    "Kann den Basispfad für die Klasse mit Methode (1) nicht ermitteln: ", ex);
        }

        // Das obige ist fehlgeschlagen?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // das untenstehende ist für Testzwecke...
                // beginnt mit File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Kann den Basispfad für die Klasse mit Methode (2) nicht ermitteln: ", ex);
            }
        }

        // Fix, um innerhalb von Eclipse zu laufen
        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, um innerhalb von NetBeans zu laufen
        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;
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X