1410 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?

3voto

Volodya Lombrozo Punkte 1211

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

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

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

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")...

1voto

Wortig Punkte 722

Sie könnten new File("./") verwenden. Auf diese Weise gibt isDirectory() true zurück (zumindest auf dem Windows-Plattform). Andererseits gibt new File("") isDirectory() false zurück.

1voto

Adam M. Gamboa G. Punkte 388

Dies ist ein sehr verwirrendes Thema, und wir müssen einige Konzepte verstehen, bevor wir eine echte Lösung bieten können.

  1. Die Ansätze File und NIO File Api mit relativen Pfaden "" oder "." verwenden intern den Systemparameter "user.dir" Wert, um den Rückgabeort zu bestimmen.

  2. Der Wert von "user.dir" basiert auf dem Benutzer-Arbeitsverzeichnis, und das Verhalten dieses Wertes hängt vom Betriebssystem und der Art und Weise ab, wie das JAR ausgeführt wird.

  3. Zum Beispiel wird das Ausführen eines JAR von Linux aus einem Datei-Explorer (Öffnen durch Doppelklick) user.dir auf das Benutzerverzeichnis setzen, unabhängig vom Standort des JARs. Wenn das gleiche JAR von der Befehlszeile aus ausgeführt wird, wird es den JAR-Standort zurückgeben, weil jeder cd-Befehl zum JAR-Standort das Arbeitsverzeichnis geändert hat.

Nachdem das gesagt wurde, werden die Lösungen unter Verwendung von Java NIO, Files oder "user.dir" Eigenschaft für alle Szenarien funktionieren, sofern "user.dir" den korrekten Wert hat.

String userDirectory = System.getProperty("user.dir");
String userDirectory2 = new File("").getAbsolutePath();
String userDirectory3 = Paths.get("").toAbsolutePath().toString();

Wir könnten den folgenden Code verwenden:

new File(MyApp.class.getProtectionDomain()
                     .getCodeSource()
                     .getLocation()
                     .toURI().getPath())
     .getParent();

um den aktuellen Standort des ausgeführten JARs zu erhalten, und persönlich habe ich folgenden Ansatz verwendet, um den erwarteten Standort zu erhalten und die "user.dir" Systemeigenschaft zu Beginn der Anwendung zu überschreiben. So erhalte ich später, wenn die anderen Ansätze verwendet werden, immer die erwarteten Werte.

Mehr Details hier -> https://blog.adamgamboa.dev/getting-current-directory-path-in-java/

    public class MyApp {

      static {
        //Dieser statische Block wird ganz am Anfang der APP ausgeführt, noch vor der Hauptmethode.
        try{
          File file = new File(MyApp.class.getProtectionDomain().getCodeSource()
                           .getLocation().toURI().getPath());
          String basePath = file.getParent();
          //Überschreibt den bestehenden Wert von "user.dir"
          System.getProperties().put("user.dir", basePath);
        }catch(URISyntaxException ex){
          //Fehler protokollieren
        }
      }

      public static void main(String args []){
        //Logik Ihrer App

        //All diese Ansätze sollten unabhängig von der Art und Weise, wie das JAR ausgeführt wird, den erwarteten Wert zurückgeben.
        String userDirectory = System.getProperty("user.dir");
        String userDirectory2 = new File("").getAbsolutePath();
        String userDirectory3 = Paths.get("").toAbsolutePath().toString();
      }
    }

Ich hoffe, dass diese Erklärung und Details für andere hilfreich sind...

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