2010-09-16 46 views
11

Tôi cần đọc một tệp trong mã của mình. Nó nằm ở đây:Làm cách nào để tham chiếu tài nguyên trong Java?

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt 

Tôi đã đặt nó vào gói nguồn để tạo tệp jar có thể chạy được (Xuất - tệp Jn Runnable) được đưa vào bình. Ban đầu tôi đã có nó trong thư mục gốc của dự án (và cũng đã thử một thư mục con bình thường), nhưng việc xuất khẩu không bao gồm nó trong jar.

Nếu trong mã của tôi, tôi làm:

File myFile = new File("com\\company\\somePackage\\MyFile.txt"); 

file jar nằm một cách chính xác các tập tin, nhưng chạy cục bộ (Run như-> Java Main ứng dụng) ném một tập tin không tìm thấy ngoại lệ vì nó hy vọng nó sẽ được :

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt"); 

Nhưng điều này không thành công trong tệp jar của tôi. Vì vậy, câu hỏi của tôi là, làm cách nào để làm cho khái niệm này hoạt động cho cả chạy cục bộ và trong tệp jar của tôi?

Trả lời

33

Sử dụng ClassLoader.getResourceAsStream hoặc Class.getResourceAsStream. Sự khác biệt chính giữa hai là phiên bản ClassLoader luôn sử dụng đường dẫn "tuyệt đối" (trong tệp jar hoặc bất kỳ thứ gì) trong khi phiên bản Class liên quan đến chính lớp đó, trừ khi bạn thêm tiền tố với /.

Vì vậy, nếu bạn có một lớp com.company.somePackage.SomeClasscom.company.other.AnyClass (trong classloader giống như tài nguyên), bạn có thể sử dụng:

SomeClass.class.getResourceAsStream("MyFile.txt") 

hoặc

AnyClass.class.getClassLoader() 
       .getResourceAsStream("com/company/somePackage/MyFile.txt"); 

hoặc

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt"); 
0

Nếu Tôi đã đặt i tệp trong tệp jar, nó chỉ hoạt động nếu và chỉ khi tôi sử dụng

...getResourceAsStream("com/company/somePackage/MyFile.txt") 

Nếu tôi đã sử dụng đối tượng Tệp không bao giờ hoạt động. Tôi cũng nhận được ngoại lệ FileNotFound. Bây giờ, tôi ở lại với đối tượng InputStream.

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