2010-05-26 37 views

Trả lời

11

Bạn có thể sử dụng CodeSource#getLocation() cho việc này. CodeSource có sẵn theo ProtectionDomain#getCodeSource(). Lần lượt ProtectionDomain có sẵn theo Class#getProtectionDomain().

URL location = getClass().getProtectionDomain().getCodeSource().getLocation(); 
File file = new File(location.getPath()); 
// ... 

Điều này trả về vị trí chính xác của Class được đề cập.

Cập nhật: theo nhận xét, dường như đã có trong đường dẫn lớp. Sau đó, bạn có thể chỉ sử dụng ClassLoader#getResource() trong đó bạn chuyển đường dẫn gốc-gói tương đối.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = classLoader.getResource("filename.ext"); 
File file = new File(resource.getPath()); 
// ... 

Bạn thậm chí có thể lấy nó dưới dạng InputStream sử dụng ClassLoader#getResourceAsStream().

InputStream input = classLoader.getResourceAsStream("filename.ext"); 
// ... 

Đó cũng là cách sử dụng tài nguyên đóng gói bình thường. Nếu nó nằm bên trong một gói, sau đó sử dụng ví dụ com/example/filename.ext thay thế.

+1

+1, nhưng lưu ý rằng P rotectionDomain.getCodeSource() và CodeSource.getLocation() có thể là null. –

+0

@ bkail: Nó thực sự có thể trả về null khi nó được tải bằng cách sử dụng trình nạp lớp nhà được thiết kế kém, hoặc khi nó được tải từ một số nguồn luồng bên ngoài, v.v. Tuy nhiên, điều này thường không áp dụng cho các chương trình Java "cụ thể" với 'chính() '. – BalusC

+0

Điều này chắc chắn thực hiện công việc - nhưng nó trông không đẹp lắm. Những gì tôi cần làm là tải một tập tin cấu hình mà cần phải được trong cùng một thư mục như jar của tôi nhưng có thể được chạy từ bất kỳ vị trí nào. Đây có phải là cách thích hợp để lấy thông tin vị trí tệp không? – markovuksanovic

-1

nếu bạn muốn nhận được "thư mục làm việc" cho chương trình hiện đang chạy, sau đó chỉ cần sử dụng:

new File(""); 
+2

Thư mục làm việc không nhất thiết là nơi chương trình được đặt. – Douglas

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