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?

0voto

Avon97 Punkte 37

Versuchen Sie so etwas, ich weiß, ich bin spät dran für die Antwort, aber diese offensichtliche Sache ist in Java8 passiert, einer neuen Version, von der aus diese Frage gestellt wird, aber...

Der Code

import java.io.File;

public class Find_this_dir {

    public static void main(String[] args) {

//irgendein Fehler im Java-Pfad ist korrekt, aber die Datei existiert nicht
        File this_dir = new File("");

//aber diese beiden Befehle funktionieren auch, um das aktuelle Verzeichnis zu bekommen        
//      File this_dir_2 = new File(this_dir.getAbsolutePath());
        File this_dir_2 = new File(new File("").getAbsolutePath());

        System.out.println("new File(" + "\"\"" + ")");
        System.out.println(this_dir.getAbsolutePath());
        System.out.println(this_dir.exists());
        System.out.println("");
        System.out.println("new File(" + "new File(" + "\"\"" + ").getAbsolutePath()" + ")");
        System.out.println(this_dir_2.getAbsolutePath());
        System.out.println(this_dir_2.exists());
    }
}

Dies wird funktionieren und Ihnen den aktuellen Pfad anzeigen, aber ich weiß nicht, warum Java versagt, das aktuelle Verzeichnis in new File(""); zu finden, obwohl ich den Java8-Compiler verwende...

Dies funktioniert einwandfrei, ich habe es sogar getestet new File(new File("").getAbsolutePath());

Jetzt haben Sie das aktuelle Verzeichnis in einem File-Objekt, also (Beispiel Dateiobjekt ist f dann),

f.getAbsolutePath() gibt Ihnen den Pfad in einem String-Variablentyp...

Getestet in einem anderen Verzeichnis, das nicht Laufwerk C ist, funktioniert einwandfrei

0voto

Andrew Mititi Punkte 670

Meine bevorzugte Methode besteht darin, sie aus den Systemumgebungsvariablen abzurufen, die dem aktuellen laufenden Prozess zugeordnet sind. In diesem Fall wird Ihre Anwendung vom JVM verwaltet.

String currentDir = System.getenv("PWD");
/*
 /home/$User/Documents/java
*/

Um andere Umgebungsvariablen anzuzeigen, die nützlich sein könnten, wie z.B. das Home-Verzeichnis, die Betriebssystemversion ........

//Home-Verzeichnis
String HomeDir = System.getEnv("HOME");

//Ausgaben für Unix
/home/$USER

//Gerätenutzer
String user = System.getEnv("USERNAME");

//Ausgaben für Unix
$USER

Das Schöne an diesem Ansatz ist, dass alle Pfade für alle Arten von Betriebssystemplattformen aufgelöst werden.

0voto

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.

0voto

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

-1voto

VenerableAgents Punkte 638

Keine der hier geposteten Antworten hat bei mir funktioniert. Hier ist, was funktioniert hat:

java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

Bearbeiten: Die endgültige Version in meinem 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()

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