2013-04-16 30 views
6

Tôi chỉ muốn đọc một tệp trong chương trình của mình. Tệp nằm ở một thư mục phía trên thư mục làm việc tại "../f.fsh". Vì vậy, các mã sau chạy một cách chính xác khi tôi chạy nó trong IDETại sao getResourceAsStream() hoạt động trong IDE chứ không phải JAR?

String name="../f.fsh"; 
InputStream is = getClass().getResourceAsStream(name); 
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION 
BufferedReader br = new BufferedReader(isreader); 

nhưng khi tôi tạo ra một tập tin JAR đã f.fsh nén bên trong của nó và chạy nó, nó bị treo khi tạo InputStreamReader, vì InputStream là null.

Tôi đã đọc một loạt câu trả lời cho các câu hỏi về luồng đầu vào và tệp JAR và những gì tôi nhận được là tôi nên sử dụng đường dẫn tương đối, nhưng tôi đã làm điều đó. Từ những gì tôi hiểu getResourceAsStream() có thể tìm thấy các tập tin liên quan đến thư mục gốc của dự án, đó là những gì tôi muốn. Tại sao nó không hoạt động trong JAR? Điều gì đang xảy ra, làm thế nào tôi có thể sửa nó?

Có phải liên quan đến classpath không? Tôi nghĩ rằng đó là chỉ để bao gồm các tập tin bên ngoài để bình đang được chạy.

Tôi cũng đã cố gắng, nhưng vẫn thất bại, khi đặt một dấu gạch chéo trong:

InputStream is = getClass().getResourceAsStream("\\"+name); 

Tôi nhìn: How to get a path to a resource in a Java JAR file andfound rằng nội dung của một JAR có thể không nhất thiết phải được truy xuất như một tập tin. Vì vậy, tôi đã thử nó với sao chép các tập tin liên quan đến các jar (một thư mục lên từ jar), và điều đó vẫn không thành công. Trong mọi trường hợp, tôi muốn để lại các tập tin của tôi trong lọ và có thể đọc chúng ở đó. Tôi không biết chuyện gì đang xảy ra.

Trả lời

3

Nếu .. hoạt động trong Class.getResourceAsStream() trong khi chạy từ Eclipse, đó là lỗi trong Eclipse. Eclipse và các IDE khác triển khai các trình nạp lớp tùy chỉnh để tìm nạp các tài nguyên từ dự án khi chạy. Dường như việc triển khai trình nạp lớp trong Eclipse không thực hiện tất cả các xác nhận hợp lệ cần thiết khi nhập vào phương thức getResourceAsStream(). Trong trường hợp này, lỗi có lợi cho bạn, nhưng bạn vẫn sẽ cần phải suy nghĩ lại cách bạn cấu trúc các tài nguyên để mã của bạn hoạt động trong mọi trường hợp.

+0

Cảm ơn, điều đó có ý nghĩa. Tôi đã thay đổi vị trí tệp của mình và vị trí của tài nguyên của tôi và nó có thể vượt qua lỗi này trong bình. Tôi sẽ không bao giờ nghĩ rằng Eclipse có một lỗi trong lợi của tôi. Cảm ơn bạn rất nhiều! – AAB

8

Bạn không thể sử dụng .. với Class.getResourceAsStream().

Để tải một tài nguyên f.fsh trong gói giống như lớp, sử dụng SomeClass.class.getResourceAsStream("f.fsh")

Để tải một tài nguyên f.fsh trong một foo.bar tiểu gói của gói của lớp, sử dụng SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

Để tải một tài nguyên f.fsh trong bất kỳ gói com.company.foo.bar nào, sử dụng SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

Điều này được mô tả trong javadoc của phương pháp getResource(), mặc dù nó thiếu ví dụ.

+0

Cảm ơn bạn đã trả lời, tôi thấy những gì bạn đang nói về việc thêm dấu gạch chéo hoặc không vào đầu. Nó không hoạt động với ".."? Nó dường như undestand ".." khi tôi chạy nó từ nhật thực. Nhưng nó chỉ là không tương thích từ bình? Bạn có biết tại sao nó? – AAB

+1

Tôi thậm chí còn ngạc nhiên khi nó hoạt động khi sử dụng hết bình. Javadoc không cho phép .. được sử dụng. Nó chỉ là cách nó được thiết kế. –

+0

Chỉ gặp vấn đề tương tự. Tôi đoán là khi thực hiện từ các tệp lớp trên đĩa, đối số được gửi một cách đơn giản (được phân tích cú pháp) sang một hàm OS, do đó hoạt động ngay cả khi không có giao thức sau. Điều này đã được thử nghiệm với SE6 btw. – user

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