Nehmen wir an, ich habe meine Hauptklasse in C:\Users\Justian\Documents\
. Wie kann ich mein Programm dazu bringen, zu zeigen, dass es in ist C:\Users\Justian\Documents
?
Hardcodierung ist keine Option - sie muss anpassbar sein, wenn sie an einen anderen Ort verschoben wird.
Ich möchte eine Reihe von CSV-Dateien in einem Ordner ablegen, das Programm alle Dateien erkennen lassen, dann die Daten laden und bearbeiten. Ich möchte wirklich nur wissen, wie man zu diesem Ordner navigiert.
java
path
working-directory
Justian Meyer
quelle
quelle
Antworten:
Eine Möglichkeit wäre die Verwendung der Systemeigenschaft. Dadurch erhalten
System.getProperty("user.dir");
Sie "Das aktuelle Arbeitsverzeichnis, als die Eigenschaften initialisiert wurden". Dies ist wahrscheinlich was Sie wollen. um herauszufinden, wo derjava
Befehl ausgegeben wurde, in Ihrem Fall in dem Verzeichnis mit den zu verarbeitenden Dateien, obwohl sich die eigentliche JAR-Datei möglicherweise an einer anderen Stelle auf dem Computer befindet. Das Verzeichnis der eigentlichen JAR-Datei zu haben, ist in den meisten Fällen nicht so nützlich.Im Folgenden wird das aktuelle Verzeichnis ausgedruckt, aus dem der Befehl aufgerufen wurde, unabhängig davon, in welcher .class- oder .jar-Datei sich die .class-Datei befindet.
Wenn Sie sich in befinden
/User/me/
und Ihre JAR-Datei mit dem obigen Code im/opt/some/nested/dir/
Befehl enthalten ist,java -jar /opt/some/nested/dir/test.jar Test
wird ausgegebencurrent dir = /User/me
.Als Bonus sollten Sie auch einen guten objektorientierten Befehlszeilenargument-Parser verwenden. Ich empfehle JSAP , den Java Simple Argument Parser. Auf diese Weise können Sie
System.getProperty("user.dir")
etwas anderes verwenden und alternativ übergeben, um das Verhalten zu überschreiben. Eine viel wartbarere Lösung. Dies würde die Übergabe des zu verarbeitenden Verzeichnisses sehr einfach machen und auf etwas zurückgreifen können,user.dir
wenn nichts übergeben wurde.quelle
user.dir
ist sehr einfach zu verwenden. System.getProperty ("user.dir");Verwenden Sie
CodeSource#getLocation()
. Dies funktioniert auch in JAR-Dateien einwandfrei. Sie können erhaltenCodeSource
vonProtectionDomain#getCodeSource()
und dieProtectionDomain
wiederum können erhalten werden vonClass#getProtectionDomain()
.Update gemäß Kommentar des OP:
Dies würde eine Hardcodierung / Kenntnis des relativen Pfades in Ihrem Programm erfordern. Erwägen Sie lieber, den Pfad zum Klassenpfad hinzuzufügen, damit Sie ihn verwenden können
ClassLoader#getResource()
Oder um seinen Weg als
main()
Argument zu übergeben.quelle
getLocation()
Methode zurückgegeben wird. Andere werden offensichtlich nicht funktionieren.Druckt so etwas wie:
Beachten Sie, dass
File.getCanonicalPath()
eine aktivierte IOException ausgelöst wird, aber Dinge wie entfernt werden../../../
quelle
quelle
Ich habe gerade verwendet:
...
quelle
Paths.get("").toAbsolutePath();
Paths.get("my/file").toAbsolutePath()
bekomme/my/file
, bekomme ich das definitiv nicht.Wenn Sie Ihr aktuelles Arbeitsverzeichnis abrufen möchten, verwenden Sie die folgende Zeile
quelle
Wenn Sie den absoluten Pfad des aktuellen Quellcodes möchten, ist mein Vorschlag:
quelle
Wer sagt, dass sich Ihre Hauptklasse in einer Datei auf einer lokalen Festplatte befindet? Klassen werden häufiger in JAR-Dateien gebündelt und manchmal über das Netzwerk geladen oder sogar im laufenden Betrieb generiert.
Was möchten Sie eigentlich tun? Es gibt wahrscheinlich einen Weg, der keine Annahmen darüber macht, woher die Klassen kommen.
quelle