2010-02-18 55 views
12

Tôi hơi bị kẹt trong một dự án mà tôi đang làm việc ở nơi tôi muốn tải trong một tệp văn bản từ một thư mục khác. Tôi đang sử dụng Netbeans và có, vì mục đích của vấn đề này, hai thư mục, một với lớp của tôi và một thư mục có tài nguyên.Các sự cố khi sử dụng Class.getResourceAsStream() trong Java

Lớp học ở ../misc/[ClassName] và tệp văn bản tôi muốn tải là Trong số ../resources/[Name].txt

Điều này nghe có vẻ không thể tin được, và đã thực hiện Java trong một thời gian. Tôi cho rằng cách tốt nhất để tải tệp này thay vì chỉ sử dụng FileReader sẽ là sử dụng getResourceAsStream, như được hiển thị:

InputStream is = 
     this.getClass().getClassLoader().getResourceAsStream(_filename + ".txt"); 

Lý tưởng giúp tôi tiết kiệm thời gian và không phải mã hóa trong một tệp ath. Bây giờ, vấn đề của tôi là tôi liên tục giữ null trở lại từ mã trên, và thực sự bất kỳ hoán vị khác tôi có thể đưa vào nó. Tôi đã thử /resource/filename.txt hoặc resource/filename.txt làm tham số, sử dụng .getClass().getResourceAsStream như trái ngược với getClassLoader(), mọi thứ vẫn trả về cùng một kết quả.

Để tránh bất kỳ sự nhầm lẫn nào, tôi đã kiểm tra tên tệp và chắc chắn tên tệp cũng như trong đúng trường hợp, v.v., vì vậy đó không phải là vấn đề. Bất kỳ ý tưởng? Tôi biết tôi chỉ có thể sử dụng FileReader để hoàn thành cùng một mục tiêu, nhưng nó là một loại nguyên tắc ngay bây giờ!

Trả lời

4

Đường dẫn lớp học của bạn bắt đầu ở đâu? Nó có bắt đầu từ misc hoặc .. không?

Bạn có thể đăng giá trị this.getClass().getName() không?

Nếu trả về misc.ClassName bạn phải sử dụng this.getClass().getResourceAsStream("/resources/filename.txt").

+0

Đúng, bỏ 'getClassLoader()' sẽ sửa lỗi. Ít nhất, nó đã làm cho tôi làm: 'getClass(). GetResourceAsStream (" ../ resources/filename.txt ")' – Ash

+0

@Ash: điều này làm cho không có sự khác biệt. 'Cls.getResourceAsStream()' chỉ là một cách viết tắt cho 'cls.getClassLoader(). GetResourceAsStream()'. – BalusC

+1

@ BalusC: nó tạo ra tất cả sự khác biệt trong một ứng dụng thử nghiệm mà tôi đã cố gắng để tái tạo sự cố. Với thêm "getClassLoader()" nó trả về null, không trả về luồng (hoặc URL cho 'getResource()'). – Ash

13

Lớp này dường như được tải bởi trình nạp lớp khác mà không biết về tài nguyên chút nào. Thay vào đó, hãy sử dụng ngữ cảnh ClassLoader của ngữ cảnh thu được từ số Thread hiện tại thay thế. Nó biết mọi thứ.

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(_filename + ".txt"); 
7

tôi sử dụng IntelliJ và đã tìm thấy một chung "Gotcha" đối với tôi là quên để xác định mô hình tài nguyên thích hợp để bao gồm các file .txt, các file .css, vv Điều này có nghĩa là khi quá trình xây dựng chạy nó sẽ loại trừ các tệp này khỏi tệp jar mà nó tạo, gây ra các cuộc gọi đến getResource() để trả về giá trị rỗng.

Tôi nghi ngờ một điều tương tự có thể xảy ra với môi trường Netbeans của bạn vì vậy có thể đáng để kiểm tra.

+0

gosh, tại sao họ không thêm tệp .txt theo mặc định ... điều này đã lưu tôi một giờ – somid3

5

Tôi gặp vấn đề tương tự như David Meadows,
nó đã hoạt động từ năm 2008 và không có vấn đề gì. Đọc tất cả bài đăng về getResourceAsStream() tại đây. Vấn đề của tôi là tôi có thể đọc một số tệp từ tệp jar. Tất cả các tệp png đều có thể đọc được nhưng tệp wav thì không. Điều kỳ lạ là nếu tôi đổi tên tệp .wav thành .png. Các tập tin có thể tải và chơi!

Khi tôi triển khai ứng dụng hoạt động, có thể nào đó là IntelliJ bằng cách nào đó?

Lưu ý: Tôi biết các tệp .wav có thể sử dụng để tiếp cận với JarFile và JarEntry.

Giải pháp trong intelliJ: Trong cài đặt dự án, thêm thư mục có tệp tài nguyên, trong tệp âm thanh của tôi, dưới dạng nguồn. Thêm

? *. Wav (hoặc filetype pref của bạn)

trong Settings-> Mẫu biên dịch Resource.

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