class.getResources()和classLoader.getResources()
阿新 • • 發佈:2019-01-31
Class.getResources()和classLoader.getResources()區別
Class.getResources()
Class.getResources(String path) path如果是以 / 開頭,就從classpath中去找(classpath可以認為是eclipse的bin目錄或者是target的classes目錄),如果不以/開頭,就以當前類的位置開始找,假如實在上一級目錄,那麼就是 ../application/xml.
獲取application.xml檔案的方式有
<!--從當前類的位置去查詢 -->
System.out.println(IndexService.class.getResource("application.xml"));
<!--從classpath下查詢該檔案 -->
System.out.println(IndexService.class.getResource("/main/test/com/jt3/web/application.xml"));
classLoader.getResources()
獲取當前類的載入器,從載入器的環境下進行載入,就是classpath目錄下,注意不能用/開頭,至於是為什麼,看圖
System.out.println(IndexService.class.getResource(""));
後面已經有一個/了,說明就是直接從classpath/目錄下查詢
<!-- 從當前classpath下找到-->
System.out.println(IndexService.class.getResource("/main/webapp/WEB-INF/applicationContext.xml"));
class.getResourceAsStream 和getClassLoader().getResourceAsStream
class.getResourceAsStream,如之前的class.getResource一樣,只不過包裝了一個流,返回給你一個輸入流
<!-- 從當前類的位置開始找-->
InputStream in = IndexService.class.getResourceAsStream("application.xml");
in.read(bytes);
System.out.println(new String(bytes,new String("UTF-8")));
<--從classpath下找,注意要加上/ -->
InputStream in = IndexService.class.getResourceAsStream("/main/test/com/jt3/web/application.xml");
getClassLoader().getResourceAsStream
獲取當前類的類載入器,在classpath下載入,不要加/
InputStream in = IndexService.class.getClassLoader().getResourceAsStream("main/test/com/jt3/web/application.xml");
還有一種比較安全的做法
<!-- 這個做法就是,獲取當前的執行緒的類載入器,效率比較高-->
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("main/test/com/jt3/web/application.xml");
總結
可以看到的是,class.getResource() 和 classLoader.getResource(),class的方法是對classLoader的包裝,其實底層都是Jvm封裝的絕對路徑來找地址,而個人也建議不要用絕對路徑,因為可能隨著環境的更變,產生classpath的目錄不同,這是必然會產生錯誤。getResourceAsStream就是getResource的封裝,相當於先用Resource獲取一個檔案路徑,在一個new InputStream(獲取到的檔案路徑),給你返回一個流。請注意,classLoader中的路徑不能用/開頭,不然只能獲取不到,為null