麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

Java加載資源文件時的路徑問題的解決辦法

2019-11-26 16:10:20
字體:
供稿:網(wǎng)友

加載資源文件比較常用的有兩種:

一、用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類的源碼就知道:

復(fù)制代碼 代碼如下:

public java.net.URL getResource(String name) {
         name = resolveName(name);
         ClassLoader cl = getClassLoader0();
         if (cl==null) {
             // A system class.
             return ClassLoader.getSystemResource(name);
         }
         return cl.getResource(name);
     }

復(fù)制代碼 代碼如下:

private String resolveName(String name) {
         if (name == null) {
             return name;
         }
         if (!name.startsWith("/")) {
             Class c = this;
             while (c.isArray()) {
                 c = c.getComponentType();
             }
             String baseName = c.getName();
             int index = baseName.lastIndexOf('.');
             if (index != -1) {
                 name = baseName.substring(0, index).replace('.', '/')
                     +"/"+name;
             }
         } else {
             name = name.substring(1);
         }
         return name;
     }

getResource根據(jù)傳進來的name值(即相對路徑或者絕對路徑的形式),我們看到經(jīng)過resolveName處理之后就調(diào)用了ClassLoader c1進行了加載,ClassLoader的加載路徑的形式是不以‘/'開頭的相對路徑,那肯定是resolveName把路徑轉(zhuǎn)換了一把,再看看resolveName方法,首先判斷是不是以‘/'開頭,如果以‘/'開頭,則為相對路徑,否則就是絕對路徑,注意else這個代碼塊,它將第一個字符去除掉了,確實去除掉之后就符合了ClassLoader的加載路徑,而if塊中就根據(jù)把當(dāng)前類的包路徑截取,然后將.替換成了'/',并添加上那段相對路徑,也形成了符合ClassLoader的加載路徑。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 51色视频 | 成人午夜免费观看 | 成人免费av在线播放 | 国产羞羞视频免费在线观看 | 中文字幕在线观看精品 | 爽妇网国产精品 | lutube成人福利在线观看 | 中文字幕精品在线播放 | 久久久成人精品视频 | 日韩电影一区二区三区 | 成人福利电影在线观看 | 久久国产28 | 成人一级片毛片 | 国产一区二区三区四区在线 | 成人毛片免费在线 | 国产精品久久久免费看 | 黄色av片在线观看 | 国内精品久久久久久2021浪潮 | 亚洲特黄a级毛片在线播放 久久久入口 | 国产69精品久久久久孕妇黑 | 欧美a视频 | 国产一国产一级毛片视频 | 在线免费观看精品 | 亚洲成人涩涩 | 草操视频| 日本精品久久久一区二区三区 | 黄色片网页 | 天天躁狠狠躁夜躁2020挡不住 | 亚洲精品a在线观看 | 国产精品久久77777 | 色播视频在线播放 | 久久精品日产高清版的功能介绍 | 日本a在线观看 | 欧美韩国一区 | 欧美亚洲免费 | 久久久久久久不卡 | hdhdhd69ⅹxxx黑人| 国产在线精品一区二区不卡 | 国产精品av久久久久久网址 | 亚洲啊v在线观看 | 黄色片免费看网站 |