Class.getResourceAsStream和ClassLoader.getResourceAsStream方法


項目中, 有時候要讀取當前classpath下的一些配置文件,下面介紹下Class.getResourceAsStream和ClassLoader.getResourceAsStream兩種方法以及兩者的區別。
關於Java類加載機制,可以參考另一篇隨筆:http://www.cnblogs.com/clarke157/p/7295493.html
 

1. Class.getResourceAsStream

首先, 我們必須先了解根路徑“/”是如何定義的,這對我們使用getResourceAsStream准確加載文件是很重要的。首先,我們要明白這個根路徑是對應類所處類路徑上的根目錄!什么意思呢?假如一個項目經過編譯之后生成了如下class文件和目錄結構:
com  
   |-github  
          |-test  
          |    |-Test1.class  
          |    |-testdata1.txt  
          |-Test2.class  
          |-testdata2.tx2
在這樣的編譯輸出目錄下,文件"testdata1.txt"的絕對路徑名為:"/com/github/demo/testdata1.txt文件"testdata2.txt"的絕對路徑名為:"/com/github/testdata2.txt"
如同getResourceAsStream方法文檔上的解釋:以/開頭時是絕對路徑,與類路徑不同的是路徑上的“."換成了"/"。
 
接下着我們看相對路徑!
 
首先我們必須明確“相對”路徑總是指相對於當前class的路徑!
 
例如,如果我們使用
 
InputStream is= Test1.class.getResourceAsStream("testdata1.txt");
 
路徑不是以/開頭,說明這是一個相對路徑,相對的是Test1.class這個文件,所以,這里的“testdata1.txt”所指的正確位置是與Test1.class處於同一目錄下的testdata1.txt文件,這一文件是存在的,所引不會報錯。
 
如果我們按相對路徑的方式通過Test1去加載testdata2.txt,則路徑應該這樣描述:
 
InputStream is= Test1.class.getResourceAsStream("../testdata2.txt");   
 
是的,用“.."表示上一級目錄。
 
如果我們按相對路徑的方式通過Test2去加載testdata1.txt,則路徑應該這樣描述:   
 
InputStream is= Test2.class.getResourceAsStream("test/testdata1.txt");   
 

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

2. ClassLoader.getResourceAsStream

class.getResourceAsStream最終調用是ClassLoader.getResourceAsStream

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

有以下規則:
1. 如果參數以/開頭,則去除/。

2. 否則把當前類的包名加在參數的前面。


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM