Verbinden von Pfaden in Java

Lesezeit: 5 Minuten

Im Python Ich kann zwei Wege mit verbinden os.path.join:

os.path.join("foo", "bar") # => "foo/bar"

Ich versuche, dasselbe in Java zu erreichen, ohne mir Gedanken darüber zu machen, ob die OS ist Unix, Solaris oder Windows:

public static void main(String[] args) {
    Path currentRelativePath = Paths.get("");
    String current_dir = currentRelativePath.toAbsolutePath().toString();
    String filename = "data/foo.txt";
    Path filepath = currentRelativePath.resolve(filename);

    // "data/foo.txt"
    System.out.println(filepath);

}

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

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

Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());

Ausgang:

/Users/user/coding/data/foo.txt

Von Java Weg Klasse Dokumentation:

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.

Hier ist der Code für die Implementierung des Unix-Dateisystems: UnixPath.toAbsolutePath()


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

    – typik89

    23. Dezember 2021 um 13:03 Uhr

Benutzer-Avatar
Akasha

Paths#get(String first, String... more) Zustände,

Konvertiert eine Pfadzeichenfolge oder a Folge von Saiten die, wenn sie verbunden werden, eine Pfadzeichenfolge bilden, zu a Path.

EIN Path repräsentiert ein leer path wird zurückgegeben, wenn first ein leerer String ist und more keine nicht-leeren Strings enthält.

Um das aktuelle Benutzerverzeichnis zu erhalten, können Sie einfach verwenden System.getProperty("user.dir").

Path path = Paths.get(System.getProperty("user.dir"), "abc.txt");
System.out.println(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,

Path path = Paths.get("/test", "inside", "abc.txt");

Keine bestimmte Methode.

Wenn Sie Java 8 oder besser verwenden, haben Sie 2 Möglichkeiten:

a) Verwenden Sie java.util.StringJoiner

StringJoiner joiner = new StringJoiner(File.pathSeparator); //Separator
joiner.add("path1").add("path2");
String joinedString = joiner.toString();

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()

    – Erdinc Ay

    29. Mai 2020 um 11:36 Uhr

Kannst du gerne machen

// /root
Path rootPath = Paths.get("/root");
// /root/temp
Path temPath = rootPath.resolve("temp");

Ein guter ausführlicher Beitrag ist hier Beispielanwendungsfall für Pfad

Der grundlegendste Weg ist:

Path filepath = Paths.get("foo", "bar");

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

Sie können die Ansätze auch kombinieren:

Path filepath = Paths.get(
    System.getProperty("user.home"), "data", "foo.txt");

Benutzer-Avatar
Patrick Parker

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);
}

Benutzer-Avatar
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:

import java.nio.file.Path;
...

Path fooBar = Path.of("foo", "bar");

1334710cookie-checkVerbinden von Pfaden in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy