it-swarm.com.de

Wie kombiniere ich Pfade in Java?

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

Diese statische Methode kombiniert einen oder mehrere Strings in einem Pfad.

291
novicer

Anstatt alles auf String-Basis zu halten, sollten Sie eine Klasse verwenden, die einen Dateisystempfad darstellt.

Wenn Sie Java 7 oder Java 8 verwenden, sollten Sie unbedingt die Verwendung von Java.nio.file.Path in Betracht ziehen. Path.resolve kann verwendet werden, um einen Pfad mit einem anderen oder mit einer Zeichenfolge zu kombinieren. Die Helper-Klasse Paths ist ebenfalls nützlich. Zum Beispiel:

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

Wenn Sie sich auf Java-7-Umgebungen vorbereiten müssen, können Sie Java.io.File wie folgt verwenden:

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

Wenn Sie es später als Zeichenfolge zurück haben möchten, können Sie getPath() aufrufen. Wenn Sie wirklich Path.Combine nachahmen wollten, könnten Sie einfach so etwas schreiben:

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

In Java 7 sollten Sie resolve verwenden:

Path newPath = path.resolve(childPath);

Während die NIO2 Path-Klasse File mit einer unnötig anderen API etwas überflüssig erscheint, ist sie in der Tat etwas eleganter und robuster.

Beachten Sie, dass Paths.get() (wie von einer anderen Person vorgeschlagen) keine Überlastung mit einer Path hat. Paths.get(path.toString(), childPath) ist NICHT dasselbe wie resolve(). Aus den Paths.get()-Dokumenten :

Beachten Sie, dass diese Methode zwar sehr praktisch ist, ihre Verwendung jedoch einen angenommenen Verweis auf das Standard-Dateisystem impliziert und die Verwendung des aufrufenden Codes einschränkt. Daher sollte es nicht in Bibliothekscode verwendet werden, der für die flexible Wiederverwendung bestimmt ist. Eine flexiblere Alternative ist die Verwendung einer vorhandenen Path-Instanz als Anker, z.

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

Die Schwesterfunktion von resolve ist die ausgezeichnete relativize :

Path childPath = path.relativize(newPath);
80

Die Hauptantwort ist die Verwendung von File-Objekten. Commons IO hat jedoch eine Klasse FilenameUtils , die diese Art von Aufgaben ausführen kann, beispielsweise die Methode concat () .

41
JodaStephen

Ich weiß, es ist lange her, seit Jons ursprünglicher Antwort, aber ich hatte eine ähnliche Anforderung wie das OP. 

Als Erweiterung von Jons Lösung bin ich auf folgendes gekommen, bei dem ein oder mehrere Pfadsegmente so viele Pfadsegmente wie möglich einnehmen.

Verwendungszweck

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();
    }
}
14
isNaN1247

Um die Antwort von JodaStephen zu verbessern, verfügt Apache Commons IO über Dateinamen-Dateien, die dies tun. Beispiel (unter Linux):

assert org.Apache.commons.io.FilenameUtils.concat("/home/bob", "work\\stuff.log") == "/home/bob/work/stuff.log"

Es ist plattformunabhängig und produziert die von Ihrem System benötigten Separatoren.

11
alpian

plattformunabhängiger Ansatz (verwendet File.separator, dh, es funktioniert, 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
11

Wenn Sie nicht mehr als Zeichenfolgen benötigen, können Sie com.google.common.io.Files verwenden.

Files.simplifyPath("some/prefix/with//extra///slashes" + "file//name")

bekommen 

"some/prefix/with/extra/slashes/file/name"
2
Gismo Ranas

Dies funktioniert auch in Java 8:

Path file = Paths.get("Some path");
file = Paths.get(file + "Some other path");
1
rootExplorr

Hier ist eine Lösung, die mehrere Pfadteile und Randbedingungen behandelt:

public static String combinePaths(String ... paths)
{
  if ( paths.length == 0)
  {
    return "";
  }

  File combined = new File(paths[0]);

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

  return combined.getPath();
}
0
Bill

Spät zur Party vielleicht, aber ich wollte meine Meinung dazu teilen. Ich verwende ein Builder-Muster und erlaube bequem verkettete append-Aufrufe. Es kann leicht erweitert werden, um das Arbeiten mit Path-Objekten zu unterstützen.

public class Files  {
    public static class PathBuilder {
        private File file;

        private PathBuilder ( File root ) {
            file = root;
        }

        private PathBuilder ( String root ) {
            file = new File(root);
        }

        public PathBuilder append ( File more ) {
            file = new File(file, more.getPath()) );
            return this;
        }

        public PathBuilder append ( String more ) {
            file = new File(file, more);
            return this;
        }

        public File buildFile () {
            return file;
        }
    }

    public static PathBuilder buildPath ( File root ) {
        return new PathBuilder(root);
    }

    public static PathBuilder buildPath ( String root ) {
        return new PathBuilder(root);
    }
}

Verwendungsbeispiel:

File root = File.listRoots()[0];
String hello = "hello";
String world = "world";
String filename = "warez.lha"; 

File file = Files.buildPath(root).append(hello).append(world)
              .append(filename).buildFile();
String absolute = file.getAbsolutePath();

Die resultierende absolute enthält etwa Folgendes:

/hello/world/warez.lha

oder vielleicht sogar:

A:\hello\world\warez.lha
0