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.

12voto

alpian Punkte 4578

Um die Antwort von JodaStephen zu verbessern, hat Apache Commons IO FilenameUtils, das dies tut. 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 alle Separatoren, die Ihr System benötigt.

6voto

Stephan Henningsen Punkte 3536

Vielleicht bin ich zu spät dran, aber ich wollte meine Meinung dazu mitteilen. Ich ziehe es vor, für so etwas nicht ganze Bibliotheken heranzuziehen. Stattdessen verwende ich ein Builder-Muster und erlaube bequem verkettete append(more) Anrufe. Es erlaubt sogar das Mischen von File et String und kann leicht erweitert werden, um Folgendes zu unterstützen Path auch. Außerdem werden die verschiedenen Pfadseparatoren sowohl unter Linux als auch unter Macintosh usw. automatisch korrekt behandelt.

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

Beispiel für die Verwendung:

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

Das Ergebnis absolute wird etwas enthalten wie:

/hello/world/warez.lha

oder vielleicht sogar:

A:\hello\world\warez.lha

4voto

Gismo Ranas Punkte 5405

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

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

zu erhalten

"some/prefix/with/extra/slashes/file/name"

2voto

Bill Punkte 536

Hier ist eine Lösung, die mit mehreren Pfadteilen und Randbedingungen umgehen kann:

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

1voto

rootExplorr Punkte 549

Dies funktioniert auch in Java 8:

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

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