Das hatte ich erwartet Path.resolve( ) würde meinem aktuellen Verzeichnis beitreten /home/user/test mit data/foo.txt Herstellung /home/user/test/data/foo.txt. Was mache ich falsch?
das könnte etwas sein, was ich nicht sehe. Ihr aktueller Pfad ist “”. Ihr zweiter Pfad ist “data/foo.txt”. Vielleicht ist Ihr Problem, dass Sie stattdessen ein Pfadobjekt drucken filepath.toString()
– cjds
25. Dezember 2015 um 2:29 Uhr
Verwenden new File(parent, child)
– Benutzer4910279
25. Dezember 2015 um 2:30 Uhr
NB import java.nio.file.Paths;
– MarkHu
22. Mai 2021 um 0:24 Uhr
Junger Hobbit
Obwohl die ursprüngliche Lösung zum Abrufen des aktuellen Verzeichnisses mithilfe von empty String funktioniert. Aber es wird empfohlen, die zu verwenden user.dir Eigenschaft für das aktuelle Verzeichnis und user.home für Heimatverzeichnis.
Ein Pfad wird als leerer Pfad betrachtet, wenn er nur aus einem Namenselement besteht, dh empty. Zugriff auf eine Datei mit einer empty path is equivalent to accessing the default directory des Dateisystems.
Warum Paths.get("").toAbsolutePath() funktioniert
Wenn eine leere Zeichenfolge an die übergeben wird Paths.get("")die zurückgegeben Path Objekt enthält leeren Pfad. Aber wenn wir anrufen Path.toAbsolutePath()es prüft, ob die Pfadlänge größer als Null ist, andernfalls verwendet es user.dir Systemeigenschaft und gibt den aktuellen Pfad zurück.
Grundsätzlich müssen Sie die erstellen Path Instanz erneut, sobald Sie den aktuellen Verzeichnispfad aufgelöst haben.
Auch würde ich vorschlagen, zu verwenden File.separatorChar für plattformunabhängigen Code.
Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
Ausgabe:
/Users/user/coding/data/foo.txt
Ich nicht, vielleicht denkt jemand, dass er an Saiten arbeitet und separatorChar ist einer “höheren Abstraktion” unterlegen, etwas, das aussieht PathBuilder(currentRelativePath).append("data").append("foo.txt")
– jingyu9575
25. Dezember 2015 um 5:29 Uhr
All diese Beispiele scheinen nicht optimal zu sein: Konvertierung von Path in String und wieder in Path
Darüber hinaus, get Methode verwendet Argument mit variabler Länge von String, die verwendet wird, um nachfolgende Pfadzeichenfolgen bereitzustellen. Also zu erstellen Path zum /test/inside/abc.txt Sie müssen es auf folgende Weise verwenden,
b) Verwenden String.join(File.pathSeparator, "path1", "path2");
Wenn Sie Java 7 oder niedriger verwenden, können Sie die Commons-Lang-Bibliothek von Apache Commons verwenden. Die Klasse StringUtils hat eine Methode, um Strings mit einem Trennzeichen zu verbinden.
c) StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
Eine Nebenbemerkung: Sie können den Linux-Pfadtrenner “https://stackoverflow.com/” für Windows verwenden (denken Sie nur daran, dass absolute Pfade so etwas wie “/C:/mydir1/mydir2” sind). Verwenden Sie immer “https://stackoverflow.com/ ” ist sehr nützlich, wenn Sie Protokolle wie file://
StringJoiner hat mich zurückgegeben /home/user/test:foo.txt
– Cybertextron
25. Dezember 2015 um 2:37 Uhr
Die Optionen, die Sie kennen, sind nicht die einzigen, die es gibt. Man könnte zum Beispiel StringBuilder anstelle von Joiner verwenden. Und tatsächlich ist Ihre Implementierung, die auf Strings und nicht auf Dateien/Pfads basiert, ziemlich naiv und würde in vielen Szenarien zu Problemen führen.
– XenoRo
25. Dezember 2015 um 5:11 Uhr
File.separator arbeitete für mich statt File.pathSeparator
– Evan Siroky
27. Oktober 2018 um 1:25 Uhr
Verwenden Sie Pathes.get(“path1”, “path2”).toAbsolutePath().toString()
Du solltest niemals schreiben Paths.get(""). Mich wundert, dass das überhaupt funktioniert. Wenn Sie explizit auf das aktuelle Verzeichnis verweisen möchten, verwenden Sie Paths.get(System.getProperty("user.dir")). Wenn Sie das Home-Verzeichnis des Benutzers möchten, verwenden Sie Paths.get(System.getProperty("user.home")).
Die zuverlässigste, plattformunabhängige Methode zum Verbinden von Pfaden in Java ist die Verwendung von Path::resolve (wie im JavaDoc für Paths::get). Für ein beliebig langes Array von Strings, die Teile eines Pfads darstellen, könnten diese mithilfe eines Java-Streams miteinander verbunden werden:
private static final String[] pieces = {
System.getProperty("user.dir"),
"data",
"foo.txt"};
public static void main (String[] args) {
Path dest = Arrays.stream(pieces).reduce(
/* identity */ Paths.get(""),
/* accumulator */ Path::resolve,
/* combiner */ Path::resolve);
System.out.println(dest);
}
Asherbret
Für Java >= 11 ist der empfohlene Weg jetzt zu verwenden Weg von Anstatt von Pfade.get, wie in früheren Antworten vorgeschlagen. Zitat aus Java 11 Dokumente:
Es wird empfohlen, einen Pfad über die Path.of-Methoden statt über die in dieser Klasse definierten get-Methoden zu erhalten, da diese Klasse in einer zukünftigen Version möglicherweise veraltet ist.
Das Folgende wird z. B. „foo“ und „bar“ gemäß dem Pfadtrennzeichen des Betriebssystems verbinden:
das könnte etwas sein, was ich nicht sehe. Ihr aktueller Pfad ist “”. Ihr zweiter Pfad ist “data/foo.txt”. Vielleicht ist Ihr Problem, dass Sie stattdessen ein Pfadobjekt drucken
filepath.toString()
– cjds
25. Dezember 2015 um 2:29 Uhr
Verwenden
new File(parent, child)
– Benutzer4910279
25. Dezember 2015 um 2:30 Uhr
NB
import java.nio.file.Paths;
– MarkHu
22. Mai 2021 um 0:24 Uhr