Lấy dòng đầu vào từ tài nguyên classpath (tệp XML)


81

Trong ứng dụng web Java, Giả sử nếu tôi muốn lấy Dòng đầu vào của một tệp XML, được đặt trong CLASSPATH (tức là bên trong thư mục nguồn ), tôi phải làm thế nào?

Câu trả lời:


99

ClassLoader.getResourceAsStream().

Như đã nêu trong nhận xét bên dưới, nếu bạn đang ở trong một ClassLoadermôi trường đa (chẳng hạn như thử nghiệm đơn vị, ứng dụng web, v.v.), bạn có thể cần sử dụng Thread.currentThread().getContextClassLoader(). Xem http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .


Xem bài đăng cá nhân để biết ví dụ về mã: tshikatshikaaa.blogspot.nl/2012/07/…
Jérôme Verstrynge

14
Nếu bạn đang ở trong môi trường nhiều trình tải lớp (chẳng hạn như kiểm thử đơn vị / ứng dụng web, v.v.), bạn có thể cần sử dụng Thread.currentThread (). GetContextClassLoader () này. Xem stackoverflow.com/questions/2308188/…
khylo

Vui lòng thêm gợi ý của @ khylo vào câu trả lời của bạn!
froginvasion

8
Một cách khác:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei Ngày

1
@zhuguowei ClassPathResource là một lớp Spring.
ichalos

31
ClassLoader.class.getResourceAsStream("/path/file.ext");

nhưng nếu triển khai ứng dụng web trong tomcat theo cách này sẽ nhận được lỗi: java.lang.NullPointerException: null , và cách đơn giản nhất tôi nghĩ lànew ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

bạn có thể xin vui lòng cho cách o làm cho nó có sẵn trong chiến tranh
Vikram Saini

Tôi gặp vấn đề tương tự khi triển khai. Bất cứ ai có thể tìm thấy một giải pháp cho tình huống này?
Augusto

12

Điều đó phụ thuộc vào vị trí chính xác của tệp XML. Nó nằm trong thư mục nguồn (trong "gói mặc định" hoặc "gốc") hay trong cùng thư mục với lớp?

Trong trường hợp trước đây, bạn phải sử dụng " /file.xml" (lưu ý dấu gạch chéo ở đầu) để tìm tệp và bạn sử dụng lớp nào để cố định vị tệp không quan trọng.

Nếu tệp XML nằm bên cạnh một số lớp, SomeClass.class.getResourceAsStream()chỉ với tên tệp là cách để thực hiện.


11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") và đảm bảo rằng tập lệnh biên dịch của bạn đang sao chép tệp xml vào vị trí trong CLASSPATH của bạn.


6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();


hoặc getClass().getResourceAsStream("...")v.v.
rogerdpack

4

Một số tùy chọn "getResourceAsStream ()" trong câu trả lời này không hoạt động với tôi, nhưng tùy chọn này đã làm được:

SomeClassWithinYourSourceDir.class.getClassLoader (). GetResourceAsStream ("yourResource");


0

Tôi đã thử giải pháp được đề xuất và dấu gạch chéo chuyển tiếp trong tên tệp không phù hợp với tôi, ví dụ: ... (). GetResourceAsStream ("/ my.properties"); null đã được trả lại

Xóa dấu gạch chéo đã hoạt động: .... getResourceAsStream ("my.properties");

Đây là từ API doc: Trước khi ủy quyền, một tên tài nguyên tuyệt đối được xây dựng từ tên tài nguyên đã cho bằng cách sử dụng thuật toán này:

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e'). 

Trong trường hợp của tôi, tôi đã nhận được null mà không cần sự /. Thêm ký tự gạch chéo đã làm việc cho tôi. Phải có một số khác biệt giữa @ hussein-terek với thiết lập của tôi và thiết lập của bạn.
Ajoy Bhatia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.