Cách lấy đường dẫn thư mục tài nguyên theo chương trình


86

Tôi có bố cục thư mục sau:

  • src
    • chủ yếu
      • java
      • tài nguyên
        • sql (tập lệnh cho cơ sở dữ liệu)
        • mùa xuân (cấu hình)
      • ứng dụng web

Trong một lớp ServletContextListener, tôi muốn truy cập các tệp trong thư mục SQL và liệt kê chúng. Về cơ bản, vấn đề của tôi là với đường dẫn, bởi vì tôi biết rằng tóm tắt việc liệt kê các tệp trong một thư mục là:

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

Có lẽ tôi có thể sử dụng ServletContextEventĐối tượng để thử và xây dựng một đường dẫn đếnresources/sql

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

Có điều gì đó tồn tại để đặt đường dẫn đó theo cách tương đối, không được mã hóa cứng không? Một cái gì đó như new File("classpath:sql")(tốt nhất là mùa xuân nếu có thể) hoặc tôi nên làm gì với servletContext để trỏ vào resources/sql?


Có ba biến thể của giải pháp, tùy thuộc vào tình huống: stackoverflow.com/a/56327069/715269
Gangnus

Câu trả lời:


69

Tôi giả sử nội dung của src/main/resources/được sao chép vào WEB-INF/classes/bên trong .war của bạn tại thời điểm xây dựng. Nếu đó là trường hợp bạn có thể làm (thay thế các giá trị thực cho tên lớp và đường dẫn đang được tải).

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

Cảm ơn!! điều này đã làm việc cho tôi, với URL đó, sau đó tôi tạo Đường dẫn cho Tệp mới và cuối cùng lấy các tệp trong thư mục đó.
yamilmedina 17/10/13

2
Bạn không cần Tệp. Bạn đã có một URL. Bạn thậm chí không thể cho rằng có một tệp hoặc một thư mục nào cả. WAR có thể chưa được giải nén.
Marquis of Lorne,

MyServletContextListener ở đây có nghĩa là gì?
Tejesh Raut

@TejeshRaut Nó là phần mềm giữ chỗ cho một lớp thực hiện javax.servlet.ServletContextListener. Tôi đã sử dụng điều đó làm ví dụ vì câu hỏi có một đoạn mã từ contextInitialized đó là một phương thức được xác định bởi ServletContextListenergiao diện.
Dev

59

Cuối cùng, đây là những gì tôi đã làm:

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
Bạn có chắc chắn sử dụng "/sql"làm tham số không? Tôi gặp vấn đề với dấu gạch chéo bắt đầu, Thay vào đó "sql"hoạt động.
Abdull

2
Xin lưu ý rằng bạn có thể nhận được một URL khác với this.getClass (). GetResource ("/ sql"));
ShadowGames

Điều này sẽ không hoạt động trên tất cả các vùng chứa. Tomcat chẳng hạn.
Marquis of Lorne,

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

...

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

Cần lưu ý rằng điều này sẽ hạn chế các tùy chọn triển khai của bạn, ClassPathResource.getFile()chỉ hoạt động nếu vùng chứa đã phát nổ (giải nén) tệp chiến tranh của bạn.


6

Chỉ cần sử dụng lớp com.google.common.io.Resources . Thí dụ:

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

Sau đó, bạn có các phương thức như: .getContent (), .getFile (), .getPath (), v.v.


1
Họ cũng hỗ trợ lấy tài nguyên trong khi mã đang được thực thi từ một tệp jar?
Displee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.