Ich möchte mit Java auf mein aktuelles Arbeitsverzeichnis zugreifen.
Mein Code:
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);
Ausgabe:
Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32
Meine Ausgabe ist nicht korrekt, da das Laufwerk C nicht mein aktuelles Verzeichnis ist.
Wie erhalte ich das aktuelle Verzeichnis?
cd
Befehl an Ihrer Eingabeaufforderung ausführen, wenn Sie diesen ausführen?Antworten:
Dadurch wird ein vollständiger absoluter Pfad gedruckt, von dem aus Ihre Anwendung initialisiert wurde.
Aus der Dokumentation :
java.io
Relative Pfadnamen für die Paketauflösung unter Verwendung des aktuellen Benutzerverzeichnisses. Das aktuelle Verzeichnis wird als Systemeigenschaft dargestellt,user.dir
dh das Verzeichnis, aus dem die JVM aufgerufen wurde.quelle
Siehe: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html
Mit
java.nio.file.Path
undjava.nio.file.Paths
können Sie Folgendes tun, um zu zeigen, was Java für Ihren aktuellen Pfad hält. Dies gilt für 7 und mehr und verwendet NIO.Dies gibt aus,
Current relative path is: /Users/george/NetBeansProjects/Tutorials
dass in meinem Fall die Klasse ausgeführt wurde. Wenn Sie Pfade relativ konstruieren, indem Sie kein führendes Trennzeichen verwenden, um anzuzeigen, dass Sie einen absoluten Pfad erstellen, wird dieser relative Pfad als Ausgangspunkt verwendet.quelle
Paths.get("").getParent()
, gibt esnull
. Stattdessen funktioniert dies :Paths.get("").toAbsolutePath().getParent()
.Die folgenden Arbeiten auf Java 7 und höher (siehe hier für Dokumentation).
quelle
import java.io.File; File(".").getAbsolutePath()
?Paths.get()
kann insofern als besser angesehen werden, als es direkten Zugriff auf die leistungsfähigerePath
Schnittstelle bietet..normalize()
in diesem Zusammenhang?Returns a path that is this path with redundant name elements eliminated.
Dadurch erhalten Sie den Pfad Ihres aktuellen Arbeitsverzeichnisses:
Und dies gibt Ihnen den Pfad zu einer Datei namens "Foo.txt" im Arbeitsverzeichnis:
Bearbeiten: Um einen absoluten Pfad des aktuellen Verzeichnisses zu erhalten:
* Update * So erhalten Sie das aktuelle Arbeitsverzeichnis:
quelle
Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
Path
Objekt, das auf eine Datei verweist,.
die im aktuellen Arbeitsverzeichnis aufgerufen wird. Verwenden Sie eine leere Zeichenfolge, anstatt"."
für mich zu arbeiten.Das ist die Lösung für mich
quelle
new File("").getAbsoluteFile()
stattdessen, um dies zu beheben ./
beim Erstellen eines relativen Pfads verwenden sollte. Ich habe mich geirrt, fang nicht damit an/
.../
funktioniert auch zum Aufsteigen in den Verzeichnisbaum..
.Ich habe diese Lösung in den Kommentaren gefunden, die besser als andere und tragbarer ist:
Oder auch
quelle
Was lässt Sie denken, dass c: \ windows \ system32 nicht Ihr aktuelles Verzeichnis ist? Das
user.dir
Eigenschaft soll explizit "Aktuelles Arbeitsverzeichnis des Benutzers" sein.Anders ausgedrückt, c: \ windows \ system32 ist wahrscheinlich Ihr CWD , es sei denn, Sie starten Java über die Befehlszeile . Wenn Sie also doppelklicken, um Ihr Programm zu starten, ist es unwahrscheinlich, dass CWD das Verzeichnis ist, aus dem Sie doppelklicken.
Bearbeiten : Es scheint, dass dies nur für alte Windows- und / oder Java-Versionen gilt.
quelle
user.dir
ist durchweg der Ordner, in dem ich auf die JAR-Datei doppelklickt habe.Verwenden Sie
CodeSource#getLocation()
.Dies funktioniert auch in JAR-Dateien einwandfrei. Sie können erhalten
CodeSource
vonProtectionDomain#getCodeSource()
und dieProtectionDomain
wiederum können erhalten werden vonClass#getProtectionDomain()
.quelle
quelle
""
wenn die Anwendung aus einer JAR-Datei oder einem CLASSPATH-Element ausgeführt wird. Nicht das, wonach gefragt wurde.getClass()
ist eine Objektmethode, daher funktioniert es in einem statischen Kontext nicht, nur das zu entfernenthis
. Sie müssten sich explizit auf die Klasse beziehen, in der Sie sich befindenMyClass.class.getClassLoader().....
.Im Allgemeinen als Dateiobjekt:
Möglicherweise möchten Sie eine vollständig qualifizierte Zeichenfolge wie "D: / a / b / c" ausführen.
quelle
Ich bin unter Linux und erhalte für beide Ansätze das gleiche Ergebnis:
Paths.get("")
docsSystem.getProperty("user.dir")
docsquelle
Auf Linux beim Ausführen jar - Datei aus Terminal , kehren diese beide gleich
String
: „/ home / Current“ , egal, wo ich ist JAR - Datei ist. Es hängt nur davon ab, welches aktuelle Verzeichnis Sie mit Ihrem Terminal verwenden, wenn Sie die JAR-Datei starten.Wenn Ihr
Class
mitmain
angerufen werden würdeMainClass
, dann versuchen Sie:Dies gibt einen
String
mit absolutem Pfad der JAR- Datei zurück.quelle
Wenn Sie Windows verwenden, gibt user.dir das Verzeichnis wie erwartet zurück, jedoch NICHT, wenn Sie Ihre Anwendung mit erhöhten Rechten starten (als Administrator ausführen). In diesem Fall erhalten Sie C: \ WINDOWS \ system32
quelle
Ich hoffe, Sie möchten auf das aktuelle Verzeichnis einschließlich des Pakets zugreifen. Wenn sich Ihr Java-Programm in befindet
c:\myApp\com\foo\src\service\MyTest.java
und Sie bis dahin drucken möchten,c:\myApp\com\foo\src\service
können Sie den folgenden Code ausprobieren:Hinweis: Dieser Code wird nur in Windows mit Oracle JRE getestet.
quelle
File.separator
stattdessen verwenden oder einFile
Konstruktor mit mehreren Argumenten ). 3. Der Klassenpfad wird in der Befehlszeile angegeben, und das 'aktuelle Verzeichnis einschließlich des Pakets' (??) lautet: a. zuerst angegeben, b. absolut angegeben, c. stimmt genau mit dem CWD überein (auch bei Windows-Groß- und Kleinschreibung), und d. ist ein Nachkomme des CWDErwähnen Sie, dass es nur eingecheckt ist,
Windows
aber ich denke, es funktioniert perfekt auf anderen Betriebssystemen [Linux,MacOs,Solaris
] :).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 beim Starten aus
cmd
dem aktuellen Verzeichnis istsystem32
.;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
oder durchgeführt habe, ziemlich gut zu funktionieren()%&$%^@#
es funktioniert gut.ProcessBuilder
mit dem folgenden wie folgt:🍂 ..
🍂
getBasePathForClass(Class<?> classs)
:quelle
Das aktuelle Arbeitsverzeichnis ist in verschiedenen Java-Implementierungen unterschiedlich definiert. Für bestimmte Versionen vor Java 7 gab es keine konsistente Möglichkeit, das Arbeitsverzeichnis abzurufen. Sie können dies umgehen,
-D
indem Sie eine Java-Datei mit starten und eine Variable definieren, die die Informationen enthältEtwas wie
Das ist nicht ganz richtig, aber Sie bekommen die Idee. Dann
System.getProperty("com.mycompany.workingDir")
...quelle
Angenommen, Sie versuchen, Ihr Projekt in Eclipse oder NetBean auszuführen oder über die Befehlszeile allein zu stehen. Ich habe eine Methode geschrieben, um das Problem zu beheben
Überall dort, wo Sie den Basispfad zum Lesen der Datei erhalten möchten, können Sie Ihre Ankerklasse an die obige Methode übergeben. Das Ergebnis ist möglicherweise das, was Sie benötigen: D.
Beste,
quelle
Keine der hier veröffentlichten Antworten hat bei mir funktioniert. Folgendes hat funktioniert:
Bearbeiten: Die endgültige Version in meinem Code:
quelle
Dies ist meine Silberkugel, wenn jemals der Moment der Verwirrung hereinbricht (nenne es als erstes in der Hauptsache). Möglicherweise wird JVM beispielsweise von IDE auf eine andere Version verschoben. Diese statische Funktion durchsucht die aktuelle Prozess-PID und öffnet VisualVM für diese PID. Die Verwirrung hört genau dort auf, weil Sie alles wollen und es bekommen ...
quelle
System.getProperty("java.class.path")
quelle
Dies ist der aktuelle Verzeichnisname
Dies ist der aktuelle Verzeichnispfad
quelle