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:
ClassLoader.getResourceAsStream()
.
Như đã nêu trong nhận xét bên dưới, nếu bạn đang ở trong một ClassLoader
mô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 .
InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
ClassLoader.class.getResourceAsStream("/path/file.ext");
java.lang.NullPointerException: null
, và cách đơn giản nhất tôi nghĩ lànew ClassPathResource("/path/to/your/file").getInputStream()
Đ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.
someClassWithinYourSourceDir.getClass (). getResourceAsStream ();
getClass().getResourceAsStream("...")
v.v.
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");
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').
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.