最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2013年04月26日 15:32:35   作者:  
今天偶然看到一篇關(guān)于tomcat加載servlet的文章,不由得想起了java加載資源文件的路徑問題,資源文件可以使xml,properties,圖片等,可以是任何文件

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

一、用ClassLoader,說到這里就不得不提一下ClassLoader的分類,java內(nèi)置的ClassLoader主要有三種,

第一種是根類加載器(bootstrap class loader),用C++來編寫,負(fù)責(zé)將一些關(guān)鍵的Java類,如java.lang.Object和其他一些運(yùn)行時(shí)代碼先加載進(jìn)內(nèi)存中。 所負(fù)責(zé)加載的包:BootStrp------>JRE/lib/rt.jar

第二種是擴(kuò)展類加載器(ExtClassLoader),由java類編寫,負(fù)責(zé)將JRE中的一些類加載進(jìn)內(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)系,可以通過實(shí)例化類加載器時(shí),將父類加載器的實(shí)例作為構(gòu)造參數(shù)傳到類加載器中。

關(guān)于類加載器的詳細(xì)資料,可以自行搜索。
 

獲取到應(yīng)用類加載器之后,就是獲取資源文件了,調(diào)用loader.getResource(path)可以加載相應(yīng)路徑下的資源文件,不能以‘/'開頭,關(guān)于包內(nèi)的資源可以把包當(dāng)做普通的文件夾,以'/'分隔每個(gè)包。

如:URL url2 =  ClassLoader.getSystemClassLoader().getResource("demo/names.ser");是獲取demo包內(nèi)的names.ser序列化文件。

二、用需要加載的當(dāng)前類的getResource方法來加載,其實(shí)這個(gè)方法也是調(diào)用的加載這個(gè)類的類加載器來獲得資源文件的,只不過是獲取的參數(shù)不同。

 (1)要想獲取class所在包內(nèi)的文件可以用相對(duì)路徑直接訪問包內(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文件


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

相關(guān)文章

  • Spring?DI依賴注入過程解析

    Spring?DI依賴注入過程解析

    依賴注入是由“依賴”和“注入”兩個(gè)詞匯組合而成,那么我們?cè)僖淮雾樚倜希謩e分析這兩個(gè)詞語(yǔ),這篇文章主要介紹了Spring?DI依賴注入詳解,需要的朋友可以參考下
    2022-11-11
  • 詳解分別用Kotlin和java寫RecyclerView的示例

    詳解分別用Kotlin和java寫RecyclerView的示例

    本篇文章主要介紹了詳解分別用Kotlin和java寫RecyclerView的示例,詳解分別用Kotlin和java寫RecyclerView的示例
    2017-12-12
  • Java遍歷文件夾下所有文件并重新命名

    Java遍歷文件夾下所有文件并重新命名

    這篇文章主要為大家詳細(xì)介紹了Java遍歷文件夾下所有文件并重新命名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 詳解spring cloud config實(shí)現(xiàn)datasource的熱部署

    詳解spring cloud config實(shí)現(xiàn)datasource的熱部署

    這篇文章主要介紹了詳解spring cloud config實(shí)現(xiàn)datasource的熱部署,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • SonarQube安裝、配置與使用教程圖解

    SonarQube安裝、配置與使用教程圖解

    這篇文章主要介紹了SonarQube安裝、配置與使用教程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • gradle安裝配置以及使用最新方法

    gradle安裝配置以及使用最新方法

    這篇文章主要給大家介紹了關(guān)于gradle安裝配置以及使用的相關(guān)資料,Gradle是一個(gè)基于ApacheAnt和ApacheMaven概念的項(xiàng)目自動(dòng)化構(gòu)建開源工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • JDK1.7 Paths,Files類實(shí)現(xiàn)文件夾的復(fù)制與刪除的實(shí)例

    JDK1.7 Paths,Files類實(shí)現(xiàn)文件夾的復(fù)制與刪除的實(shí)例

    下面小編就為大家分享一篇JDK1.7 Paths,Files類實(shí)現(xiàn)文件夾的復(fù)制與刪除的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。以前跟隨小編過來看看吧
    2017-11-11
  • Java Thread之Sleep()使用方法總結(jié)

    Java Thread之Sleep()使用方法總結(jié)

    這篇文章主要介紹了Java Thread之Sleep()使用方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 零基礎(chǔ)寫Java知乎爬蟲之獲取知乎編輯推薦內(nèi)容

    零基礎(chǔ)寫Java知乎爬蟲之獲取知乎編輯推薦內(nèi)容

    上篇文章我們拿百度首頁(yè)做了個(gè)小測(cè)試,今天我們來個(gè)復(fù)雜的,直接抓取知乎編輯推薦的內(nèi)容,小伙伴們可算松了口氣,終于進(jìn)入正題了,哈哈。
    2014-11-11
  • Java命令行下Jar包打包小結(jié)

    Java命令行下Jar包打包小結(jié)

    這篇文章主要介紹了Java命令行下Jar包打包小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12

最新評(píng)論

名山县| 平舆县| 石嘴山市| 海宁市| 德化县| 黑水县| 邮箱| 吉安县| 沧源| 大田县| 武汉市| 驻马店市| 陆河县| 曲沃县| 横峰县| 凤台县| 遂宁市| 宿松县| 额济纳旗| 开原市| 鄂尔多斯市| 板桥市| 左云县| 双峰县| 巢湖市| 上饶市| 仙居县| 丹阳市| 友谊县| 锦州市| 翁牛特旗| 清徐县| 兴义市| 民县| 繁昌县| 广安市| 勃利县| 曲阜市| 五家渠市| 景德镇市| 宜州市|