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?
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?
Yanıtlar:
ClassLoader.getResource
Doğ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 File
nesne oluşturabilir ve getAbsolutePath
yöntemi kullanabilirsiniz :
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
Maven'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.
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!)
new File(resource.toURI()).getAbsolutePath();
(yani Yol nesnesine ihtiyacınız olduğunu düşünmüyorum?)
new File(YourClass.class.getResource("abc").toURI().getPath())
.
.getResource("/abc")
İ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);
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
Mutlak yola giden yolda iki sorun var:
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 src
veya src/test/resource
buraya bir şey eklemeniz gerekecektir .
Kodu kendinize ekleyebilir ve sahip olduğunuz yolları görebilirsiniz.