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) 雙親委派模型