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?

2voto

bachden Punkte 431

Angenommen, Sie versuchen, Ihr Projekt in Eclipse, Netbean oder eigenständig von der Befehlszeile aus auszuführen. Ich habe eine Methode geschrieben, um das zu beheben

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, 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 Netbean zu laufen
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // Ende der Korrektur
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Kann Basispfad für Klasse nicht feststellen: " + clazz.getName());
    }
}

Um es zu verwenden, übergeben Sie überall, wo Sie den Basispfad zum Lesen von Dateien erhalten möchten, Ihre Ankerklasse an die obige Methode, das Ergebnis könnte das sein, was Sie benötigen :D

Beste Grüße,

1voto

Volodya Lombrozo Punkte 1211

Für Java 11 könnten Sie auch verwenden:

var path = Path.of(".").toRealPath();

0voto

MJB Punkte 9166

Das aktuelle Arbeitsverzeichnis wird in verschiedenen Java-Implementierungen unterschiedlich definiert. Für bestimmte Versionen vor Java 7 gab es keine konsistente Möglichkeit, das Arbeitsverzeichnis zu erhalten. Dies konnte umgangen werden, indem man die Java-Datei mit -D startete und eine Variable definierte, um die Informationen zu speichern

So etwas Ähnliches wie

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

Das ist nicht ganz richtig, aber Sie verstehen die Idee. Dann System.getProperty("com.mycompany.workingDir")...

0voto

Tonecops Punkte 109

Dies ist meine Geheimwaffe, wenn sich der Moment der Verwirrung zusammenbraut. (Nennen Sie es als erstes in main). Vielleicht ist zum Beispiel die JVM versehentlich von der IDE auf eine andere Version verschoben worden. Diese statische Funktion sucht die aktuelle Prozess-PID und öffnet VisualVM auf dieser PID. Die Verwirrung hört einfach auf, denn du willst alles und du bekommst es...

 public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //als nächstes den aktuellen jdk/jre suchen
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}

0voto

Ted Punkte 48

Dies entspricht nicht genau dem, was gefragt wurde, aber hier ist eine wichtige Anmerkung: Wenn Java auf einem Windows-Rechner ausgeführt wird, platziert der Oracle-Installer ein "java.exe" in C:\Windows\system32, und dies fungiert als Starter für die Java-Anwendung (ES SEI DENN, es gibt bereits ein java.exe im PATH, und die Java-Anwendung wird über die Befehlszeile gestartet). Deshalb gibt File(".") immer C:\Windows\system32 zurück, und deshalb ergeben Beispiele, die von macOS oder Unix-Implementierungen ausgeführt werden, unterschiedliche Ergebnisse im Vergleich zu Windows.

Leider gibt es dazu wirklich keine universell richtige Antwort, soweit ich in zwanzig Jahren Java-Programmierung herausgefunden habe, es sei denn, Sie möchten Ihren eigenen nativen Starter-Executable mithilfe von JNI Invocation erstellen und das aktuelle Arbeitsverzeichnis aus dem nativen Starter-Code abrufen, wenn er gestartet wird. Alles andere wird zumindest einige Nuancen haben, die unter bestimmten Situationen versagen könnten.

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