載入資源檔案比較常用的有兩種:
一、用ClassLoader,說到這裡就得提一下ClassLoader的分類,java內建的ClassLoader主要有三種,
第一種是根類別載入器(bootstrap class loader),用C++來編寫,負責將一些關鍵的Java類,如java.lang.Object和其他一些執行時間程式碼先載入進記憶體。 所負責載入的套件:BootStrp------>JRE/lib/rt.jar
第二種是擴充類別載入器(ExtClassLoader),由java類別編寫,負責將JRE中的一些類別載入進記憶體。負責載入的套件: ExtClassLoader---------->JRE/lib/ext/*.jar
第三種是應用程式類別載入器(AppClassLoader)或稱為系統類別載入器,負責將CLASSPATH中的類別載入記憶體。可以透過ClassLoader.getSystemClassLoader()來取得應用程式類別載入器;
再來所說加類別載器的繼承,類別載入器不是垂直繼承的父子關係,而是一種組合關係,可以透過實例化類別載入器時,將父類別載入器的實例作為建構參數傳送到類別載入器中。
關於類別載入器的詳細資料,可以自行搜尋。
取得到應用程式類別載入器之後,就是取得資源文件了,呼叫loader.getResource(path)可以載入對應路徑下的資源文件,不能以'/'開頭,關於包內的資源可以把包當作普通的資料夾,以'/'分隔每個包。
如:URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser");是取得demo包內的names.ser序列化檔案。
二、用需要載入的目前類別的getResource方法來加載,其實這個方法也是呼叫的載入這個類別的類別載入器來取得資源檔案的,只不過是取得的參數不同。
(1)要取得class所在套件內的檔案可以用相對路徑直接存取套件內的資源;如:Demo1.class.getResource("names.ser");取得的是Demo1的class檔案所在套件內的資源
(2)要取得包外的資源檔案必須以'/'開頭,如URL url = Demo1.class.getResource("/demo/names.ser");取得的是demo包內的names.ser文件
其實第二種方式是第一種方式的封裝,都是用的ClassLoader來載入的資源檔。為什麼這麼說呢?看一下Class類的源碼就知道: