1. 程式人生 > >java讀取配置檔案的推薦方法getResource、getResourceAsStream

java讀取配置檔案的推薦方法getResource、getResourceAsStream

在java開發中經常會讀取配置檔案,如果把檔案路徑寫死,就太LOW了,也不符合編碼規範。

在網上找了一些資料後,發現有兩種方法:xxx.class.getResource("")  和 xxx.class.getClassLoader().getResource("")

1.先看一個例子:

其實,class.getResource("/") == class.getClassLoader().getResource(""),

Class.getResource和ClassLoader.getResource本質上是一樣的,都是使用ClassLoader.getResource載入資源的。

對於Class.getResource:

先獲取檔案的路徑path,不以'/'開頭時,預設是從此類所在的包下取資源;path以'/'開頭時,則是從專案的ClassPath根下獲取資源。

對於ClassLoader.getResource:

同樣先獲取檔案的路徑,path不以'/'開頭時,首先通過雙親委派機制,使用的逐級向上委託的形式載入的,最後發現雙親沒有載入到檔案,最後通過當前類載入classpath根下資原始檔。

對於getResource("/"),'/'表示Boot ClassLoader中的載入範圍,因為這個類載入器是C++實現的,所以載入範圍為null。

 

2.以上兩種方法返回的都是 java.net.URL物件,如果需要得到相應的String型別,可以用以下方法:

xxx.class.getResource("").getPath();

xxx.class.getResource("").getFile();

或者通過  InputStream input = getClass().getClassLoader().getResourceAsStream("config\\config.properties");  獲取IO流,讓其它方法呼叫。

注:getResourceAsStream()的路徑同getResource

 

3.下面講下getPath() 和 getFile()的區別:

返回的結果:

url.getFile()=/pub/files/foobar.txt?id=123456

url.getPath()=/pub/files/foobar.txt

 

4.類載入器ClassLoader

我們都知道 Java 檔案被執行,第一步,需要通過 javac 編譯器編譯為 class 檔案;第二步,JVM 執行 class 檔案,實現跨平臺。

而 JVM 虛擬機器第一步肯定是 載入 class 檔案,所以,類載入器實現的就是(來自《深入理解Java虛擬機器》):

通過一個類的全限定名來獲取描述此類的二進位制位元組流

類載入器有幾個重要的特性:

(1) 每個類載入器都有自己的預定義的搜尋範圍,用來載入 class 檔案;

(2) 每個類和載入它的類載入器共同確定了這個類的唯一性,也就是說如果一個 class 檔案被不同的類載入器載入到了 JVM 中,

     那麼這兩個類就是不同的類,雖然他們都來自同一份 class 檔案;

(3) 雙親委派模型