Class.getResourceAsStream和ClassLoader.getResourceAsStream

原文:http://blog.csdn.net/bluishglc/article/details/38753047


關於Class.getResourceAsStream

首先, 我們必須先了解根路徑“/”是如何定義的,這對我們使用getResourceAsStream準確加載文件是很重要的。首先,我們要明白這個根路徑是對應類所處類路徑上的根目錄!什麼意思呢?假如一個項目經過編譯之後生成了如下class文件和目錄結構:

com  
   |-github  
          |-demo  
          |    |-A.class  
          |    |-1.txt  
          |-B.class  
          |-2.txt

在這樣的編譯輸出目錄下,文件"1.txt"的絕對路徑名爲:"/com/github/demo/1.txt文件"2.txt"的絕對路徑名爲:"/com/github/2.txt

如同getResourceAsStream方法文檔上的解釋:以/開頭時是絕對路徑,與類路徑不同的是路徑上的“."換成了"/"。


接下着我們看相對路徑!


首先我們必須明確“相對”路徑總是指相對於當前class的路徑!


例如,如果我們使用


InputStream is= A.class.getResourceAsStream("1.txt");


路徑不是以/開頭,說明這是一個相對路徑,相對的是A.class這個文件,所以,這裏的“1.txt”所指的正確位置是與A.class處於同一目錄下的1.txt文件,這一文件是存在的,所引不會報錯。


如果我們按相對路徑的方式通過A去加載2.txt,則路徑應該這樣描述:


InputStream is= A.class.getResourceAsStream("../2.txt");   


是的,用“.."表示上一級目錄。


如果我們按相對路徑的方式通過B去加載1.txt,則路徑應該這樣描述:   


InputStream is= B.class.getResourceAsStream("demo/1.txt");   


注意!demo前是沒有/的,這是一個相對路徑,是相對於B所在包下的demo子包裏的1.txt文件,所以這個路徑也是正確無誤的!

關於ClassLoader.getResourceAsStream

class.getResourceAsStream最終調用是ClassLoader.getResourceAsStream

只是在這之前對參數進行了調整。如果參數已/開頭,則去除/,否則把當前類的包名加在參數的前面。

在使用ClassLoader.getResourceAsStream時,路徑直接使用相對於classpath的絕對路徑,並且不能已 / 開頭。

InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章