Giả sử thiết lập maven tiêu chuẩn.
Giả sử trong thư mục tài nguyên của bạn, bạn có một tệp abc
.
Trong Java, làm thế nào tôi có thể lấy đường dẫn tuyệt đối đến tệp?
Giả sử thiết lập maven tiêu chuẩn.
Giả sử trong thư mục tài nguyên của bạn, bạn có một tệp abc
.
Trong Java, làm thế nào tôi có thể lấy đường dẫn tuyệt đối đến tệp?
Câu trả lời:
Bạn có thể sử dụng ClassLoader.getResource
phương pháp để có được tài nguyên chính xác.
URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();
HOẶC LÀ
Mặc dù điều này có thể không hoạt động mọi lúc, nhưng một giải pháp đơn giản hơn -
Bạn có thể tạo một File
đối tượng và sử dụng getAbsolutePath
phương thức:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
để tham chiếu tệp, vì đây là nơi chuẩn mà Maven đặt các tệp tài nguyên sau khi xử lý (ví dụ: plugin maven-resources có thể đã thực hiện thay thế thuộc tính trên abc.txt). Tốt hơn nhiều là sử dụng abc.txt qua getResource () từ classpath.
Cách thích hợp thực sự hoạt động:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
Bây giờ không quan trọng tệp trong classpath về mặt vật lý, nó sẽ được tìm thấy miễn là tài nguyên thực sự là một tệp chứ không phải mục nhập JAR.
(Dường như hiển nhiên new File(resource.getPath())
không hoạt động cho tất cả các đường dẫn! Đường dẫn vẫn được mã hóa URL!)
new File(resource.toURI()).getAbsolutePath();
(tức là tôi không nghĩ rằng bạn cần đối tượng Đường dẫn?)
new File(YourClass.class.getResource("abc").toURI().getPath())
nếu bạn muốn.
.getResource("/abc")
Tạo cá thể classLoader của lớp bạn cần, sau đó bạn có thể truy cập các tệp hoặc tài nguyên dễ dàng. bây giờ bạn truy cập đường dẫn bằng getPath()
phương thức của lớp đó.
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);
Để trả về một tệp hoặc đường dẫn tệp
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
Có hai vấn đề trên con đường đi đến con đường tuyệt đối của chúng ta:
Đoạn mã sau sẽ cung cấp cho chúng ta tất cả các đường dẫn hữu ích:
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);
Ở đây nghiên cứu cả hai chức năng có thể được sử dụng để bản địa hóa thư mục tài nguyên. Đối với class
nó, nó có thể được nhận theo một trong hai cách, tĩnh hoặc động.
Nếu dự án không có trong plugin, mã nếu chạy trong JUnit, sẽ in:
loaderDir = /C:.../ws/source.dir/target/test-classes/
localDir = /C:.../ws/source.dir/target/test-classes/package/
Vì vậy, để truy cập src / rest / resources, chúng ta nên đi lên và xuống cây tệp. Cả hai phương pháp đều có thể được sử dụng. Lưu ý, chúng tôi không thể sử dụng getResource(resourceFolderName)
, vì thư mục đó không nằm trong thư mục đích. Tôi hy vọng không ai đặt tài nguyên vào các thư mục đã tạo.
Nếu lớp nằm trong gói có trong plugin, đầu ra của cùng một bài kiểm tra sẽ là:
loaderDir = /C:.../ws/plugin/bin/
localDir = /C:.../ws/plugin/bin/package/
Vì vậy, một lần nữa chúng ta nên đi lên và xuống cây thư mục.
Điều thú vị nhất là trường hợp khi gói được khởi chạy trong plugin. Như thử nghiệm plugin JUnit, ví dụ của chúng tôi. Đầu ra là:
loaderDir = /C:.../ws/plugin/
localDir = /package/
Ở đây chúng ta có thể nhận được đường dẫn tuyệt đối chỉ kết hợp các kết quả của cả hai hàm. Và nó là không đủ. Giữa chúng, chúng ta nên đặt đường dẫn cục bộ của nơi chứa các gói lớp, tương đối với thư mục plugin. Có thể, bạn sẽ phải chèn một cái gì đó như src
hoặc src/test/resource
ở đây.
Bạn có thể chèn mã vào của bạn và xem các đường dẫn mà bạn có.