Projenizin / kaynaklar klasöründeki dosyaya giden mutlak yol nasıl elde edilir


95

Standart maven kurulumunu varsayın.

Kaynaklar klasörünüzde bir dosyanız olduğunu söyleyin abc.

Java'da dosyanın mutlak yolunu nasıl alabilirim lütfen?


Bir Maven eklentisi yazmak ister misiniz? Veya programınız çalıştığında dosyaya erişmek istiyor musunuz?
Gyro Gearless


Duruma bağlı olarak üç çözüm çeşidi vardır: stackoverflow.com/a/56327069/715269
Gangnus

Yanıtlar:


73

ClassLoader.getResourceDoğru kaynağı elde etmek için yöntemi kullanabilirsiniz .

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

VEYA

Bu her zaman işe yaramasa da, daha basit bir çözüm -

Bir Filenesne oluşturabilir ve getAbsolutePathyöntemi kullanabilirsiniz :

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

8
Çalışma dizininin maven kökü olmasına dayandığından, sınırlı kullanım tavsiyesi. Ve o zaman bile, target/classes/abc.txtMaven'in işlendikten sonra kaynak dosyalarını koyduğu kanonik yer olduğu için dosyaya başvurmayı tercih etmelisiniz (örneğin, maven-kaynaklar eklentisi abc.txt üzerinde özellik değişikliği yapmış olabilir). Abc.txt dosyasını sınıf yolundan getResource () aracılığıyla kullanmak çok daha iyidir.
Gyro Gearless

2
Ya bir son kullanıcı uygulamanızı çalıştırılabilir bir JAR olarak çalıştırıyorsa? O zaman fiziksel bir Dosya olmayacak. GetResource () kullanmanız için başka bir neden de budur ve örneğin onunla ne yapmak istediğinize bağlı olarak ona giriş akışını açabilirsiniz.
Matthew Wise

6
Bu doğru cevap olarak kaldırılabilir mi? @Karol S aşağıda cevapladı - bu doğru cevap olmalı (dolayısıyla oylama tutarsızlığı)
DanGordon

3
Yanlış cevap. Lütfen aşağıdaki cevaba bakınız @Karol
bhathiya-perera

168

Gerçekte işe yaramanın doğru yolu:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

Artık sınıf yolundaki dosyanın fiziksel olarak nerede olduğu önemli değil, kaynak aslında bir dosya olduğu ve bir JAR girişi olmadığı sürece bulunacaktır.

(Görünüşe göre bariz new File(resource.getPath())olan yol tüm yollar için işe yaramıyor! Yol hala URL kodlu!)


5
Ya da muhtemelen şunu yapabilirsiniz: new File(resource.toURI()).getAbsolutePath();(yani Yol nesnesine ihtiyacınız olduğunu düşünmüyorum?)
Dan King

1
ToURI () hakkında iyi bir ipucu, bu, yolunuzda% 20'lik boşlukların çıkmasını önler!
Matthew Wise

29
Teşekkürler! Bu neredeyse benim için çalıştı. Ama bir değişiklik yapmam gerekiyordu: YourClass.class.getClassLoader (). GetResource ("abc");
yngwietiger

İstersen alternatif olarak yapabilirsin new File(YourClass.class.getResource("abc").toURI().getPath()).
Mike Rylander

2
Bunun bu kadar çok insan için eğik çizgi olmadan nasıl çalıştığını anlamıyorum:.getResource("/abc")
cahen

28

Başlayan yolu belirtmeniz gerekiyor /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

12

İhtiyaç duyduğunuz sınıfın classLoader örneğini oluşturun, ardından dosyalara veya kaynaklara kolayca erişebilirsiniz. şimdi getPath()o sınıfın yöntemini kullanarak yola erişirsiniz .

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

1

Bir dosya veya dosya yolu döndürmek için

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

0

Mutlak yola giden yolda iki sorun var:

  1. Bulunan yerleşim, kaynak dosyaların bulunduğu yerde değil, sınıfın kaydedildiği yerde olacaktır. Ve kaynak klasörü neredeyse kesinlikle projenin kaynak klasöründe bir yerde olacaktır.
  2. Kaynağın alınması için aynı işlevler, sınıf bir eklentide veya doğrudan çalışma alanında bir pakette çalışıyorsa farklı çalışır.

Aşağıdaki kod bize tüm faydalı yolları verecektir:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

Burada kaynak klasörünün yerelleştirilmesi için kullanılabilecek her iki işlev de araştırılmıştır. Buna gelince class, her iki şekilde de, statik veya dinamik olarak elde edilebilir.


Proje eklentide değilse, kod JUnit'te çalıştırılırsa yazdırılır:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

Bu nedenle, src / rest / kaynaklar'a ulaşmak için dosya ağacında yukarı ve aşağı gitmeliyiz. Her iki yöntem de kullanılabilir. Dikkat edin, getResource(resourceFolderName)bu klasörün hedef klasörde olmaması için kullanamayız . Umarım, oluşturulan klasörlere kimse kaynak koymaz.


Sınıf eklentideki paketteyse, aynı testin çıktısı şöyle olacaktır:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

Yani, yine klasör ağacında yukarı ve aşağı gitmeliyiz.


En ilginç olanı, paketin eklentide başlatıldığı durumdur . Örneğimiz için JUnit eklenti testi olarak. Çıktı:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

Burada sadece her iki fonksiyonun sonuçlarını birleştirerek mutlak yolu elde edebiliriz . Ve bu yeterli değil. Aralarına, eklenti klasörüne göre sınıf paketlerinin bulunduğu yerin yerel yolunu koymalıyız. Muhtemelen, olarak srcveya src/test/resourceburaya bir şey eklemeniz gerekecektir .

Kodu kendinize ekleyebilir ve sahip olduğunuz yolları görebilirsiniz.

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.