原文: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");