加載資源文件比較常用的有兩種:
一、用ClassLoader,說到這里就不得不提一下ClassLoader的分類,java內(nèi)置的ClassLoader主要有三種,
第一種是根類加載器(bootstrap class loader),用C++來編寫,負(fù)責(zé)將一些關(guān)鍵的Java類,如java.lang.Object和其他一些運行時代碼先加載進內(nèi)存中。 所負(fù)責(zé)加載的包:BootStrp------>JRE/lib/rt.jar
第二種是擴展類加載器(ExtClassLoader),由java類編寫,負(fù)責(zé)將JRE中的一些類加載進內(nèi)存中。所負(fù)責(zé)加載的包: ExtClassLoader---------->JRE/lib/ext/*.jar
第三種是應(yīng)用類加載器(AppClassLoader)或者叫做系統(tǒng)類加載器,負(fù)責(zé)將CLASSPATH中的類加載到內(nèi)存中。可以通過ClassLoader.getSystemClassLoader()來獲取應(yīng)用類加載器;
再來所說加類載器的繼承,類加載器不是垂直繼承的父子關(guān)系,而是一種組合關(guān)系,可以通過實例化類加載器時,將父類加載器的實例作為構(gòu)造參數(shù)傳到類加載器中。
關(guān)于類加載器的詳細(xì)資料,可以自行搜索。
獲取到應(yīng)用類加載器之后,就是獲取資源文件了,調(diào)用loader.getResource(path)可以加載相應(yīng)路徑下的資源文件,不能以‘/'開頭,關(guān)于包內(nèi)的資源可以把包當(dāng)做普通的文件夾,以'/'分隔每個包。
如:URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser");是獲取demo包內(nèi)的names.ser序列化文件。
二、用需要加載的當(dāng)前類的getResource方法來加載,其實這個方法也是調(diào)用的加載這個類的類加載器來獲得資源文件的,只不過是獲取的參數(shù)不同。
(1)要想獲取class所在包內(nèi)的文件可以用相對路徑直接訪問包內(nèi)的資源;如:Demo1.class.getResource("names.ser");獲取的是Demo1的class文件所在包內(nèi)的資源
(2)要想獲取包外的資源文件必須以‘/'開頭,如URL url = Demo1.class.getResource("/demo/names.ser");獲取的是demo包內(nèi)的names.ser文件
其實第二種方式是對第一種方式的一個封裝,都是用的ClassLoader來加載的資源文件。為什么這么說呢?看一下Class類的源碼就知道:
新聞熱點
疑難解答
圖片精選