453 Stimmen

Wie kombiniert man Pfade in Java?

Gibt es ein Java-Äquivalent für System.IO.Path.Combine() in C#/.NET? Oder irgendeinen Code, um dies zu erreichen?

Diese statische Methode kombiniert eine oder mehrere Zeichenketten zu einem Pfad.

1 Stimmen

Diese SO könnte eine Frage helfen.

505voto

Jon Skeet Punkte 1325502

Anstatt alles stringbasiert zu halten, sollten Sie eine Klasse verwenden, die einen Dateisystempfad darstellen soll.

Wenn Sie Java 7 oder Java 8 verwenden, sollten Sie unbedingt die Verwendung von java.nio.file.Path ; Path.resolve kann verwendet werden, um einen Pfad mit einem anderen oder mit einer Zeichenkette zu kombinieren. Der Paths Hilfsklasse ist ebenfalls nützlich. Zum Beispiel:

Path path = Paths.get("foo", "bar", "baz.txt");

Wenn Sie für Umgebungen vor Java-7 sorgen müssen, können Sie java.io.File etwa so:

File baseDirectory = new File("foo");
File subDirectory = new File(baseDirectory, "bar");
File fileInDirectory = new File(subDirectory, "baz.txt");

Wenn Sie sie später als String zurückhaben wollen, können Sie getPath() . In der Tat, wenn Sie wirklich etwas nachahmen wollten Path.Combine könnten Sie einfach etwas schreiben wie:

public static String combine(String path1, String path2)
{
    File file1 = new File(path1);
    File file2 = new File(file1, path2);
    return file2.getPath();
}

190voto

Aleksandr Dubinsky Punkte 20646

In Java 7 sollten Sie resolve :

Path newPath = path.resolve(childPath);

Während die NIO2 Path-Klasse mit einer unnötig anderen API ein wenig redundant zu File erscheinen mag, ist sie in Wirklichkeit wesentlich eleganter und robuster.

Beachten Sie, dass Paths.get() (wie von jemand anderem vorgeschlagen) keine Überlast hat, die eine Path und tun Paths.get(path.toString(), childPath) ist NICHT das Gleiche wie resolve() . Von der Paths.get() documents :

Beachten Sie, dass diese Methode zwar sehr bequem ist, ihre Verwendung aber einen angenommenen Verweis auf das Standard-FileSystem impliziert und den Nutzen des aufrufenden Codes einschränkt. Daher sollte sie nicht in Bibliothekscode verwendet werden, der für eine flexible Wiederverwendung gedacht ist. Eine flexiblere Alternative ist die Verwendung einer existierenden Path Instanz als Anker, wie z.B.:

Path dir = ...
Path path = dir.resolve("file");

Die Schwesterfunktion von resolve ist die hervorragende relativize :

Path childPath = path.relativize(newPath);

47voto

JodaStephen Punkte 57302

Die wichtigste Antwort ist die Verwendung von Dateiobjekten. Allerdings Commons IO hat eine Klasse DateinameUtils die so etwas können, wie zum Beispiel die concat() Methode.

28voto

Maksim Kostromin Punkte 2581

Plattformunabhängiger Ansatz (verwendet File.separator, d.h. die Funktionsweise hängt vom Betriebssystem ab, auf dem der Code ausgeführt wird:

java.nio.file.Paths.get(".", "path", "to", "file.txt")
// relative unix path: ./path/to/file.txt
// relative windows path: .\path\to\filee.txt

java.nio.file.Paths.get("/", "path", "to", "file.txt")
// absolute unix path: /path/to/filee.txt
// windows network drive path: \\path\to\file.txt

java.nio.file.Paths.get("C:", "path", "to", "file.txt")
// absolute windows path: C:\path\to\file.txt

18voto

isNaN1247 Punkte 17483

Ich weiß, dass die ursprüngliche Antwort von Jon schon lange her ist, aber ich hatte eine ähnliche Anforderung wie die OP.

Indem ich Jons Lösung erweitere, bin ich auf die folgende Lösung gekommen, die ein oder mehrere Pfadsegmente nimmt und so viele Pfadsegmente nimmt, wie man ihr zuwerfen kann.

Verwendung

Path.combine("/Users/beardtwizzle/");
Path.combine("/", "Users", "beardtwizzle");
Path.combine(new String[] { "/", "Users", "beardtwizzle", "arrayUsage" });

Code hier für andere mit einem ähnlichen Problem

public class Path {
    public static String combine(String... paths)
    {
        File file = new File(paths[0]);

        for (int i = 1; i < paths.length ; i++) {
            file = new File(file, paths[i]);
        }

        return file.getPath();
    }
}

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