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.
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.
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();
}
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);
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.
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
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 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.
1 Stimmen
Diese SO könnte eine Frage helfen.