In Python
kann ich zwei Pfade verbinden mit os.path.join
:
os.path.join("foo", "bar") # => "foo/bar"
Ich versuche, dasselbe in Java zu erreichen, ohne mir Sorgen zu machen, ob dies der Fall 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);
}
Ich habe erwartet , dass Path.resolve( )
würde mein aktuelles Verzeichnis verbindet /home/user/test
mit data/foo.txt
machen /home/user/test/data/foo.txt
. Was mache ich falsch?
filepath.toString()
new File(parent, child)
Antworten:
Auch wenn die ursprüngliche Lösung zum Abrufen des aktuellen Verzeichnisses
empty String
funktioniert. Es wird jedoch empfohlen, dieuser.dir
Eigenschaft für das aktuelle Verzeichnis unduser.home
für das Ausgangsverzeichnis zu verwenden.Ausgabe:
Aus der Java Path- Klasse Dokumentation:
Warum
Paths.get("").toAbsolutePath()
funktioniertWenn eine leere Zeichenfolge an übergeben wird
Paths.get("")
,Path
enthält das zurückgegebene Objekt einen leeren Pfad. Beim AufrufPath.toAbsolutePath()
wird jedoch geprüft, ob die Pfadlänge größer als Null ist. Andernfalls werden dieuser.dir
Systemeigenschaften verwendet und der aktuelle Pfad zurückgegeben.Hier ist der Code für die Implementierung des Unix-Dateisystems: UnixPath.toAbsolutePath ()
Grundsätzlich müssen Sie die
Path
Instanz erneut erstellen , sobald Sie den aktuellen Verzeichnispfad aufgelöst haben.Außerdem würde ich vorschlagen,
File.separatorChar
plattformunabhängigen Code zu verwenden.Ausgabe:
quelle
separatorChar
einer "Abstraktion auf höherer Ebene" unterlegen ist, etwas, das aussiehtPathBuilder(currentRelativePath).append("data").append("foo.txt")
Paths#get(String first, String... more)
Zustände,Um das aktuelle Benutzerverzeichnis abzurufen, können Sie einfach verwenden
System.getProperty("user.dir")
.Darüber hinaus
get
verwendet die Methode das Argument variabler Länge vonString
, mit dem nachfolgende Pfadzeichenfolgen bereitgestellt werden. UmPath
für/test/inside/abc.txt
Sie zu erstellen , müssen Sie es folgendermaßen verwenden:quelle
Keine bestimmte Methode.
Wenn Sie Java 8 oder besser verwenden, haben Sie zwei Möglichkeiten:
a) Verwenden Sie java.util.StringJoiner
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 verfügt über eine Methode zum Verknüpfen von Zeichenfolgen mithilfe eines Trennzeichens.
c)
StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
Nebenbemerkung: Sie können den Linux-Pfadtrenner "/" für Windows verwenden (Denken Sie daran, dass absolute Pfade etwa "/ C: / mydir1 / mydir2" sind. Die Verwendung von "/" ist sehr nützlich, wenn Sie Protokolle wie file: // verwenden
quelle
/home/user/test:foo.txt
File.separator
arbeitete für mich stattFile.pathSeparator
Der grundlegendste Weg ist:
Du solltest niemals schreiben
Paths.get("")
. Ich bin überrascht, dass das überhaupt funktioniert. Wenn Sie explizit auf das aktuelle Verzeichnis verweisen möchten, verwenden SiePaths.get(System.getProperty("user.dir"))
. Wenn Sie das Home-Verzeichnis des Benutzers möchten, verwenden SiePaths.get(System.getProperty("user.home"))
.Sie können auch die folgenden Ansätze kombinieren:
quelle
Die zuverlässigste und plattformunabhängigste Methode zum Verbinden von Pfaden in Java ist die Verwendung von
Path::resolve
(wie im JavaDoc für angegebenPaths::get
). Für ein Array von Strings beliebiger Länge, die Teile eines Pfads darstellen, können diese mithilfe eines Java-Streams zusammengefügt werden:quelle
Sie können gerne tun
Ein guter ausführlicher Beitrag ist hier Path Sample Usecase
quelle