2013-01-04 49 views
11

Làm cách nào để chuyển đổi tên của tệp trên đường dẫn lớp thành tên tệp thực?Chuyển đổi tên tệp classpath thành tên tệp thực

Ví dụ: giả sử thư mục "C:\workspace\project\target\classes" nằm trên đường dẫn lớp của bạn. Trong thư mục đó là một tệp, chẳng hạn như info.properties.

Làm cách nào bạn xác định (khi chạy) đường dẫn tệp tuyệt đối cho tệp info.properties, chỉ được cung cấp chuỗi "info.properties"?

Kết quả sẽ là một cái gì đó như "C:\workspace\project\target\classes\info.properties".

Tại sao điều này hữu ích? Khi viết các bài kiểm tra đơn vị, bạn có thể muốn truy cập các tệp được nhúng trong tài nguyên thử nghiệm của mình (src/main/resources) nhưng đang làm việc với thư viện của bên thứ ba hoặc hệ thống khác yêu cầu tên tệp thực, chứ không phải tham chiếu classpath tương đối.

Lưu ý: Tôi đã tự trả lời câu hỏi này, vì tôi cảm thấy đây là một mẹo hữu ích, nhưng có vẻ như chưa ai từng hỏi câu hỏi này trước đây.

Trả lời

16

Sử dụng một sự kết hợp của ClassLoader.getResource() và URL.getFile()

URL url = Thread.currentThread().getContextClassLoader().getResource(resource); 
if(url == null){ 
    throw new RuntimeException("Cannot find resource on classpath: '" + resource + "'"); 
} 
String file = url.getFile(); 

Lưu ý dành cho Windows: trong ví dụ trên, kết quả thực tế sẽ

"/C:/workspace/project/target/classes/info.properties" 

Nếu bạn cần một đường dẫn giống Windows khác (ví dụ: "C:\workspace\..."), sử dụng:

String nativeFilename = new File(file).getPath(); 
+5

Điều này sẽ tạo ra gì nếu tài nguyên bên trong một cái lọ? – radai

+1

@radai đây là ví dụ về kết quả cho tệp trong một tệp jar: 'tệp:/C: /tools/some/path/jarfile.jar!/Internal/path/file.txt'. Để tìm một tập tin như vậy bằng cách sử dụng câu trả lời ở trên, bạn phải cung cấp một đường dẫn liên quan đến gốc jar - tức là. '" internal/path/file.txt "' – GreenGiant

+0

@radai Ngoài ra, hãy kiểm tra [this] (http://stackoverflow.com/questions/12025689/filenotfoundexception-when-exporting-jar/12025740#12025740) –

Các vấn đề liên quan