<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    內(nèi)蒙古java團(tuán)隊(duì)

    j2se,j2ee開發(fā)組
    posts - 139, comments - 212, trackbacks - 0, articles - 65
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    一般情況下,我們都使用相對(duì)路徑來(lái)獲取資源,這樣的靈活性比較大.

      比如當(dāng)前類為com/ketqi/Test.class

      而圖像資源比如sample.gif應(yīng)該放置在com/ketqi/sample.gif

      而如果這些圖像資源放置在icons目錄下,則應(yīng)該是com/ketqi/icons/sample.gif

      通過(guò)當(dāng)前類文件的路徑獲取資源主要有如下幾種方式:

      · 假設(shè)當(dāng)前類為com.ketqi.Test

      · 包所在的文件夾為bin

      String imageName = "icons/sample.gif"

      1, 通過(guò)Class.getResource()定位類路徑下的資源(bin/com/ketqi/icons/sample.gif)


     ?? Class?clazz?=?this.getClass();
      URL?url?=?clazz.getResource(imageName);

      2,通過(guò)ClassLoader.getResource()定位包的根目錄下的資源(bin/icons/sample.gif)


     Class?clazz?=?this.getClass();
      URLClassLoader?loader?=?(URLClassLoader)clazz.getClassLoader();
      URL?url?=?loader.getResource(imageName);

      3, 通過(guò)ClassLoader.findResource()提供自己定制的方式定位資源

      URL url = loader.findResource(imageName);

      ◆那么這三種方法有那些區(qū)別, 我們應(yīng)該在何時(shí)使用哪種方法呢?

      · Class.getResource() 方法

      該方法實(shí)際通過(guò)該Class的Class Loader的getResource()方法來(lái)獲得資源, 在調(diào)用ClassLoader的getResource()方法之前, Class.getResource()方法會(huì)對(duì)資源名稱做一定的處理,構(gòu)建一個(gè)該資源的絕對(duì)名稱(absolute name, 大意是:如果資源名稱以'/'('"u002f') 開始, 則資源的絕對(duì)名稱是'/'以后的部分. 如果imageName是"/icons/sample.gif", 則在這里會(huì)變成"icons/sample.gif"+否則對(duì)于其他情況, 絕對(duì)名稱將是如下形式(給資源名稱的前面加上modified_package_name/): modified_package_name/resource_name (修正的包名稱/資源名稱)

      其中修正的包名稱含義是將當(dāng)前對(duì)象所在的包名稱中的'.'('"u002e')替換為'/'如果ClassLoader.getResource()方法返回一個(gè)值為null的URL, 則Class.getResource()方法最終會(huì)將資源請(qǐng)求交給ClassLoader.getSystemResource(java.lang.String).

      · ClassLoader.getResource() 方法該對(duì)資源進(jìn)行查找, 資源的名稱是以'/'分隔的路徑, 這個(gè)方法首先查找自己的父親ClassLoader, 由自己的父ClassLoader來(lái)查找資源(實(shí)際上, 如果父親的父親不是空, 則父親仍會(huì)向上提交查找請(qǐng)求). 如果自己的父ClassLoader是null, 則查找Java虛擬機(jī)中內(nèi)建的class loader, 并將資源請(qǐng)求提交給它們, 如果這些操作都失敗了, 則ClassLoader會(huì)調(diào)用自己的findResource()方法來(lái)查找資源.

      · ClassLoader.findResource() 方法該方法在內(nèi)部查找指定的資源, 如果你實(shí)現(xiàn)了自己的Class Loader,則應(yīng)該重載這個(gè)方法以自己特定的方式來(lái)查找類文件和資源.

      ◆通過(guò)以上的總結(jié), 我們可以看到三點(diǎn).

      1, 無(wú)論是getResource(), 還是findResource(), 這些方法都只是資源的定位方法, 最終都只是返回一個(gè)URL, 只是對(duì)資源的定位而已, 我們隨后應(yīng)通過(guò)自己的方法來(lái)讀取這些資源. 而在Class和ClassLoader中還定義的有g(shù)etResourceAsStream方法, 該方法是getResource的增強(qiáng)版, 這里就不介紹了.

      2,如果需要以類為相對(duì)路徑查找資源, 則應(yīng)該調(diào)用Class.getResource()方法, 不要直接調(diào)用

      ClassLoader.getResource()方法. 另外, 除非是你自己定義了ClassLoader并重載了findResource方法,否則也不要直接調(diào)用ClassLoader.findResource方法, 因?yàn)樵贑lass.getResource()方法中會(huì)對(duì)資源名稱作一定的處理, 這在上面介紹了, 下面舉個(gè)實(shí)例: 假設(shè)我的當(dāng)前類在intellij工程Database下, 類所在的包是com.ketqi.test, 而icons目錄放在bin/com/ketqi/test/目錄下, 我需要得到icons/sample.gif文件的URL, 則調(diào)用this.getClass().getResource()得到的URL是: file:/E:/projects/intellij/bin/com/ketqi/test/icons/sample.gif

      3, 有時(shí)候我們希望某個(gè)jar庫(kù)的圖像資源在同一個(gè)icons下統(tǒng)一管理, 而不是為每個(gè)包下面的Class建一個(gè)icons, 也就是說(shuō)需要以庫(kù)為相對(duì)路徑來(lái)查找資源, 此時(shí)則應(yīng)該調(diào)用ClassLoader.getResource()方法, 舉個(gè)例子:

      ·某個(gè)工程有如下的包結(jié)構(gòu):

      com.ketqi.other

      com.ketqi.test

      com.ketqi.database

      ·如果以類為相對(duì)路徑, 則在每個(gè)包下都必須建立一個(gè)icons目錄, 并放置相應(yīng)的資源文件. 如下:

      com.ketqi.other/icons/...

      com.ketqi.test/icons/...

      com.ketqi.database/icons/...

      ·而我們可能希望在根目錄下放置一個(gè)icons目錄, 把所有資源放置在這里管理, 這樣還可以防止資源的重復(fù).

      就是如下形式

      com.ketqi.other

      com.ketqi.test

      com.ketqi.database

      icons/sample.gif ...

      則此時(shí)我們應(yīng)該調(diào)用ClassLoader.getResource方法, 由于它沒(méi)有對(duì)資源名稱作處理, 也就是說(shuō)沒(méi)有將修正的包名添加到資源名稱前, 所以它會(huì)在類所在的包的根下去查找資源.(運(yùn)行java程序的語(yǔ)法是java com.ketqi.other.Test, 所以根目錄是com目錄的上級(jí)目錄).

    主站蜘蛛池模板: 99亚洲精品高清一二区| 亚洲日本久久一区二区va| 91精品免费高清在线| 国产精品亚洲综合久久| 免费在线观看的黄色网址| 国内精品免费在线观看| 亚洲AV无码久久久久网站蜜桃 | 美腿丝袜亚洲综合| 中文字幕视频免费| 羞羞网站免费观看| 亚洲资源在线视频| 亚洲福利视频一区二区| 曰批全过程免费视频播放网站| 亚洲AV无码成人精品区狼人影院| 亚洲精品国产精品乱码视色| 无码日韩精品一区二区免费| 两性色午夜免费视频| 国产亚洲玖玖玖在线观看| 亚洲精品成人无限看| 日韩免费视频网站| 亚洲免费视频播放| 中文字字幕在线高清免费电影| 国产AV旡码专区亚洲AV苍井空| 亚洲人成网77777色在线播放| 日韩免费一区二区三区| 日本免费一区二区三区四区五六区| 亚洲精品国产精品| 亚洲人成在线观看| 国产亚洲AV夜间福利香蕉149| 免费A级毛片无码免费视| 无码午夜成人1000部免费视频| 粉色视频成年免费人15次| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲Av无码乱码在线观看性色| 精品免费人成视频app| 最近免费mv在线观看动漫| 免费一区二区无码视频在线播放| 亚洲狠狠成人综合网| 中文字幕亚洲综合久久| 亚洲精品无码永久在线观看你懂的| 免费观看午夜在线欧差毛片|