Java'da yolları birleştirme


100

İçinde Pythoniki yolu birleştirebilirim os.path.join:

os.path.join("foo", "bar") # => "foo/bar"

Ben eğer endişelenmeden, Java aynı başarmak için çalışıyorum OSolduğunu Unix, Solarisya da 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);

}

Bunu bekliyordum Path.resolve( )benim şimdiki dizini katılacağını /home/user/testile data/foo.txtyapım /home/user/test/data/foo.txt. Neyi yanlış anlıyorum?


1
bu görmediğim bir şey olabilir. Mevcut yolunuz "". İkinci yolunuz "data / foo.txt" dir. Belki de sorununuz, yerine bir Path nesnesi yazdırıyor gibi filepath.toString()
görünmenizdir

2
Kullanımnew File(parent, child)
saka1029

Yanıtlar:


103

empty StringÇalışmaları kullanarak mevcut dizini almak için orijinal çözüm olsa bile . Ancak user.dirözelliğin geçerli dizin ve user.homeana dizin için kullanılması önerilir .

Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());

çıktı:

/Users/user/coding/data/foo.txt

Java Path sınıfı Dokümantasyonundan:

Yol, yalnızca tek bir ad öğesinden oluşuyorsa boş bir yol olarak kabul edilir empty. empty path is equivalent to accessing the default directoryDosya sisteminin bir kullanarak bir dosyaya erişim .


Neden Paths.get("").toAbsolutePath()çalışıyor

Öğesine boş bir dizge iletildiğinde Paths.get(""), döndürülen Pathnesne boş yol içerir. Ama çağırdığımızda Path.toAbsolutePath(), yol uzunluğunun sıfırdan büyük olup olmadığını kontrol eder, aksi takdirde user.dirsistem özelliğini kullanır ve mevcut yolu döndürür.

Unix dosya sistemi uygulamasının kodu: UnixPath.toAbsolutePath ()


Temel olarak Path, geçerli dizin yolunu çözdükten sonra örneği yeniden oluşturmanız gerekir .

Ayrıca File.separatorCharplatformdan bağımsız kod kullanmanızı öneririm .

Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);

// "data/foo.txt"
System.out.println(filepath);

Çıktı:

/Users/user/coding/data/foo.txt

Ben değil, belki birisi dizeler üzerinde çalışmayı düşünüyor ve separatorChar"daha yüksek seviyeli bir soyutlamadan" daha aşağı, buna benzeyen bir şeyPathBuilder(currentRelativePath).append("data").append("foo.txt")
jingyu9575

23

Paths#get(String first, String... more) devletler

Bir yol dizesini veya dönüştürür dizeleri dizisi bir etmek, bir yol dize formunu katıldı Path.

...

Bir Pathbir temsil boş ilk boş olmayan dizeler içermez fazlası boş dize ve eğer yolunu döndürülür.

Mevcut kullanıcı dizinini almak için kullanabilirsiniz System.getProperty("user.dir").

Path path = Paths.get(System.getProperty("user.dir"), "abc.txt");
System.out.println(path);

Ayrıca, getyöntem kullanan değişken uzunluk bağımsız değişken bölgesinin Stringbir sonraki bir yol dizeleri sağlamak için kullanılacaktır. Öyleyse, sizin için yaratmak Pathiçin /test/inside/abc.txtonu aşağıdaki şekilde kullanmanız gerekir,

Path path = Paths.get("/test", "inside", "abc.txt");

9

Belirli bir yöntem değil.

Java 8 veya üstünü kullanıyorsanız, 2 seçeneğiniz vardır:

a) java.util.StringJoiner kullanın

StringJoiner joiner = new StringJoiner(File.pathSeparator); //Separator
joiner.add("path1").add("path2");
String joinedString = joiner.toString();

b) Kullanım String.join(File.pathSeparator, "path1", "path2");

Java 7 veya daha düşük bir sürüm kullanıyorsanız, apache commons'taki commons-lang kitaplığını kullanabilirsiniz. StringUtils sınıfı, bir ayırıcı kullanarak dizeleri birleştirmek için bir yönteme sahiptir.

c) StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);

Bir not: Windows için linux yol ayırıcısı "/" kullanabilirsiniz (Mutlak yolların "/ C: / dizin1 / dizin2" gibi bir şey olduğunu unutmayın. File: // gibi protokoller kullanıyorsanız her zaman "/" kullanmak çok yararlıdır.


StringJoiner bana geri döndü/home/user/test:foo.txt
cybertextron

Var olan tek seçenekler bildiğiniz seçenekler değildir. Örneğin marangoz yerine StringBuilder kullanılabilir. Ve aslında, dosyalar / yollar yerine Dizelere dayalı uygulamanız oldukça saftır ve birçok senaryoda sorunlara yol açar.
XenoRo

2
File.separatoryerine benim için çalıştıFile.pathSeparator
Evan Siroky

Pathes.get ("yol1", "yol2"). toAbsolutePath (). toString ()
Erdinc Ay

6

En basit yol şudur:

Path filepath = Paths.get("foo", "bar");

Asla yazmamalısın Paths.get(""). İşe yaramasına şaşırdım. Mevcut dizine açıkça başvurmak istiyorsanız, kullanın Paths.get(System.getProperty("user.dir")). Kullanıcının ana dizinini istiyorsanız, kullanın Paths.get(System.getProperty("user.home")).

Ayrıca yaklaşımları birleştirebilirsiniz:

Path filepath = Paths.get(
    System.getProperty("user.home"), "data", "foo.txt");

1

Java'da yolları birleştirmenin en güvenilir, platformdan bağımsız yolu kullanmaktır Path::resolve(JavaDoc'da belirtildiği gibi Paths::get). Bir yolun parçalarını temsil eden rastgele uzunluktaki Dizeler dizisi için, bunlar bir Java Akışı kullanılarak birleştirilebilir:

private static final String[] pieces = {
    System.getProperty("user.dir"),
    "data",
    "foo.txt"};
public static void main (String[] args) {
    Path dest = Arrays.stream(pieces).reduce(
    /* identity    */ Paths.get(""),
    /* accumulator */ Path::resolve,
    /* combiner    */ Path::resolve);
    System.out.println(dest);
}

1

Beğenebilirsin

// /root
Path rootPath = Paths.get("/root");
// /root/temp
Path temPath = rootPath.resolve("temp");

İyi ayrıntılı bir gönderi burada Yol Örnek Kullanım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.