วิธีรับเส้นทางไดเรกทอรีทรัพยากรโดยทางโปรแกรม


90

ฉันมีเค้าโครงไดเร็กทอรีต่อไปนี้:

  • src
    • หลัก
      • java
      • ทรัพยากร
        • sql (สคริปต์สำหรับฐานข้อมูล)
        • สปริง (การกำหนดค่า)
      • webapp

ภายในคลาส ServletContextListener ฉันต้องการเข้าถึงไฟล์ภายใต้ไดเร็กทอรี SQL และแสดงรายการ โดยทั่วไปปัญหาของฉันอยู่ที่เส้นทางเพราะฉันรู้ว่าการแสดงรายการไฟล์ภายใต้ไดเรกทอรีโดยสรุปคือ:

File folder = new File(path);
File[] listOfFiles = folder.listFiles();

บางทีฉันอาจใช้ServletContextEventObject เพื่อลองสร้างเส้นทางไปresources/sql

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}

มีบางอย่างเพื่อกำหนดเส้นทางนั้นในรูปแบบสัมพัทธ์และไม่ใช่ฮาร์ดโค้ด บางอย่างเช่นnew File("classpath:sql")(ควรสปริงถ้าเป็นไปได้) หรือฉันควรทำอย่างไรกับ servletContext เพื่อชี้ไปที่resources/sql?


วิธีแก้ปัญหามีสามแบบขึ้นอยู่กับสถานการณ์: stackoverflow.com/a/56327069/715269
Gangnus

คำตอบ:


70

ฉันสมมติว่าเนื้อหาของsrc/main/resources/ถูกคัดลอกไปWEB-INF/classes/ไว้ใน. war ของคุณในเวลาสร้าง หากเป็นเช่นนั้นคุณสามารถทำได้ (แทนค่าจริงสำหรับชื่อคลาสและพา ธ ที่กำลังโหลด)

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");

ขอบคุณ !! สิ่งนี้ใช้ได้ผลสำหรับฉันด้วย URL นั้นจากนั้นฉันก็สร้างเส้นทางสำหรับไฟล์ใหม่และในที่สุดก็รับไฟล์ในไดเรกทอรีนั้น
yamilmedina

2
คุณไม่ต้องการไฟล์ คุณมี URL แล้ว คุณไม่สามารถสันนิษฐานได้ว่ามีไฟล์หรือไดเรกทอรีอยู่เลย WAR อาจยังไม่ได้แกะออกจากกล่อง
user207421

MyServletContextListener หมายถึงอะไรที่นี่?
Tejesh Raut

@TejeshRaut javax.servlet.ServletContextListenerมันเป็นเจ้าของสถานที่สำหรับการเรียนที่นำไปปฏิบัติ ฉันใช้เป็นตัวอย่างเนื่องจากคำถามมีตัวอย่างcontextInitialized ซึ่งเป็นวิธีการที่กำหนดโดยServletContextListenerอินเทอร์เฟซ
Dev

63

สุดท้ายนี่คือสิ่งที่ฉันทำ:

private File getFileFromURL() {
    URL url = this.getClass().getClassLoader().getResource("/sql");
    File file = null;
    try {
        file = new File(url.toURI());
    } catch (URISyntaxException e) {
        file = new File(url.getPath());
    } finally {
        return file;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();

11
แน่ใจหรือว่าใช้"/sql"เป็นพารามิเตอร์ ฉันมีปัญหากับเครื่องหมายทับเริ่มต้นใช้"sql"งานได้แทน
อับดุล

2
โปรดทราบว่าคุณสามารถรับ URL ที่แตกต่างจาก this.getClass (). getResource ("/ sql"));
ShadowGames

สิ่งนี้จะใช้ไม่ได้กับคอนเทนเนอร์ทั้งหมด Tomcat เช่น
user207421

16
import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();

เป็นที่น่าสังเกตว่าสิ่งนี้จะ จำกัด ตัวเลือกการปรับใช้ของคุณClassPathResource.getFile()จะใช้ได้เฉพาะเมื่อคอนเทนเนอร์ระเบิด (คลายซิป) ไฟล์สงครามของคุณ


7

เพียงใช้คลาสcom.google.common.io.Resources ตัวอย่าง:

 URL url = Resources.getResource("file name")

หลังจากนั้นคุณมีเมธอดเช่น: .getContent (), .getFile (), .getPath () ฯลฯ


1
พวกเขายังรองรับการรับทรัพยากรในขณะที่กำลังเรียกใช้โค้ดจากไฟล์ jar หรือไม่?
ขัดใจ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.