สมมติการตั้งค่า maven มาตรฐาน
abc
กล่าวว่าในทรัพยากรของคุณโฟลเดอร์ที่คุณมีไฟล์
ใน Java ฉันจะขอพา ธ สัมบูรณ์ไปยังไฟล์ได้อย่างไร?
สมมติการตั้งค่า maven มาตรฐาน
abc
กล่าวว่าในทรัพยากรของคุณโฟลเดอร์ที่คุณมีไฟล์
ใน Java ฉันจะขอพา ธ สัมบูรณ์ไปยังไฟล์ได้อย่างไร?
คำตอบ:
คุณสามารถใช้ClassLoader.getResource
วิธีการเพื่อรับทรัพยากรที่ถูกต้อง
URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();
หรือ
แม้ว่าวิธีนี้อาจไม่ได้ผลตลอดเวลา แต่วิธีแก้ปัญหาที่ง่ายกว่า -
คุณสามารถสร้างFile
วัตถุและใช้getAbsolutePath
วิธีการ:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
เพื่ออ้างอิงไฟล์เนื่องจากนี่คือตำแหน่งที่เป็นที่ยอมรับที่ Maven วางไฟล์ทรัพยากรหลังจากการประมวลผล (ตัวอย่างเช่นปลั๊กอิน maven-resources อาจทำการแทนที่คุณสมบัติใน abc.txt) การใช้ abc.txt ผ่าน getResource () จาก classpath จะดีกว่ามาก
วิธีที่เหมาะสมที่ใช้งานได้จริง:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
ไม่สำคัญว่าตอนนี้ไฟล์ใน classpath จะอยู่ที่ใดโดยจะพบได้ตราบใดที่ทรัพยากรนั้นเป็นไฟล์จริง ๆ และไม่ใช่รายการ JAR
(เห็นได้ชัดว่าใช้new File(resource.getPath())
ไม่ได้กับทุกเส้นทางเส้นทางนี้ยังเข้ารหัส URL อยู่!)
new File(resource.toURI()).getAbsolutePath();
(เช่นฉันไม่คิดว่าคุณต้องการวัตถุ Path?)
new File(YourClass.class.getResource("abc").toURI().getPath())
หากต้องการ
.getResource("/abc")
คุณต้องระบุเส้นทางเริ่มต้นจาก /
URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
สร้างอินสแตนซ์ classLoader ของคลาสที่คุณต้องการจากนั้นคุณสามารถเข้าถึงไฟล์หรือทรัพยากรได้อย่างง่ายดาย ตอนนี้คุณเข้าถึงเส้นทางโดยใช้getPath()
วิธีการของคลาสนั้น
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);
เพื่อส่งคืนไฟล์หรือพา ธ ไฟล์
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
มีปัญหาสองประการระหว่างทางไปสู่เส้นทางสัมบูรณ์:
รหัสต่อไปนี้จะให้เส้นทางที่เป็นประโยชน์ทั้งหมดแก่เรา:
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);
ทั้งสองฟังก์ชันที่สามารถใช้สำหรับการแปลโฟลเดอร์ทรัพยากรได้รับการค้นคว้า สำหรับclass
มันสามารถทำได้ทั้งแบบคงที่หรือแบบไดนามิก
หากโปรเจ็กต์ไม่ได้อยู่ในปลั๊กอินโค้ดหากรันใน JUnit จะพิมพ์:
loaderDir = /C:.../ws/source.dir/target/test-classes/
localDir = /C:.../ws/source.dir/target/test-classes/package/
ดังนั้นในการไปที่ src / rest / resources เราควรขึ้นและลงโครงสร้างไฟล์ สามารถใช้ได้ทั้งสองวิธี สังเกตุเราใช้ไม่ได้getResource(resourceFolderName)
เพราะโฟลเดอร์นั้นไม่ได้อยู่ในโฟลเดอร์เป้าหมาย ไม่มีใครใส่ทรัพยากรในโฟลเดอร์ที่สร้างขึ้นฉันหวังว่า
หากคลาสอยู่ในแพ็คเกจที่อยู่ในปลั๊กอินผลลัพธ์ของการทดสอบเดียวกันจะเป็น:
loaderDir = /C:.../ws/plugin/bin/
localDir = /C:.../ws/plugin/bin/package/
ดังนั้นเราควรขึ้นและลงโครงสร้างโฟลเดอร์อีกครั้ง
สิ่งที่น่าสนใจที่สุดคือกรณีเมื่อเปิดตัวแพคเกจในปลั๊กอิน จากการทดสอบปลั๊กอิน JUnit สำหรับตัวอย่างของเรา ผลลัพธ์คือ:
loaderDir = /C:.../ws/plugin/
localDir = /package/
ที่นี่เราจะได้พา ธ สัมบูรณ์เฉพาะการรวมผลลัพธ์ของทั้งสองฟังก์ชัน และมันยังไม่เพียงพอ ระหว่างนั้นเราควรวางเส้นทางท้องถิ่นของสถานที่ที่แพ็กเกจคลาสอยู่ในโฟลเดอร์ปลั๊กอิน เป็นไปได้ว่าคุณจะต้องแทรกบางอย่างเป็นsrc
หรือsrc/test/resource
ที่นี่
คุณสามารถแทรกรหัสลงในของคุณและดูเส้นทางที่คุณมี