1. 程式人生 > >class.getResources()和classLoader.getResources()

class.getResources()和classLoader.getResources()

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