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

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

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

    內蒙古java團隊

    j2se,j2ee開發組
    posts - 139, comments - 212, trackbacks - 0, articles - 65
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Java獲取資源路徑的3種方法與區別

    Posted on 2010-06-04 17:20 帥子 閱讀(272) 評論(0)  編輯  收藏 所屬分類: j2ee技術專區
    一般情況下,我們都使用相對路徑來獲取資源,這樣的靈活性比較大.

      比如當前類為com/ketqi/Test.class

      而圖像資源比如sample.gif應該放置在com/ketqi/sample.gif

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

      通過當前類文件的路徑獲取資源主要有如下幾種方式:

      · 假設當前類為com.ketqi.Test

      · 包所在的文件夾為bin

      String imageName = "icons/sample.gif"

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


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

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


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

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

      URL url = loader.findResource(imageName);

      ◆那么這三種方法有那些區別, 我們應該在何時使用哪種方法呢?

      · Class.getResource() 方法

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

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

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

      · ClassLoader.findResource() 方法該方法在內部查找指定的資源, 如果你實現了自己的Class Loader,則應該重載這個方法以自己特定的方式來查找類文件和資源.

      ◆通過以上的總結, 我們可以看到三點.

      1, 無論是getResource(), 還是findResource(), 這些方法都只是資源的定位方法, 最終都只是返回一個URL, 只是對資源的定位而已, 我們隨后應通過自己的方法來讀取這些資源. 而在Class和ClassLoader中還定義的有getResourceAsStream方法, 該方法是getResource的增強版, 這里就不介紹了.

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

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

      3, 有時候我們希望某個jar庫的圖像資源在同一個icons下統一管理, 而不是為每個包下面的Class建一個icons, 也就是說需要以庫為相對路徑來查找資源, 此時則應該調用ClassLoader.getResource()方法, 舉個例子:

      ·某個工程有如下的包結構:

      com.ketqi.other

      com.ketqi.test

      com.ketqi.database

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

      com.ketqi.other/icons/...

      com.ketqi.test/icons/...

      com.ketqi.database/icons/...

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

      就是如下形式

      com.ketqi.other

      com.ketqi.test

      com.ketqi.database

      icons/sample.gif ...

      則此時我們應該調用ClassLoader.getResource方法, 由于它沒有對資源名稱作處理, 也就是說沒有將修正的包名添加到資源名稱前, 所以它會在類所在的包的根下去查找資源.(運行java程序的語法是java com.ketqi.other.Test, 所以根目錄是com目錄的上級目錄).

    主站蜘蛛池模板: 91精品成人免费国产| 国产成人亚洲毛片| 午夜视频免费在线观看| 亚洲国产精品乱码一区二区 | 97在线视频免费| 亚洲av无码专区在线播放 | 91短视频免费在线观看| 亚洲日本香蕉视频观看视频| 100部毛片免费全部播放完整| 亚洲国产av高清无码| 成人免费在线视频| 精品一区二区三区无码免费直播| 亚洲国产精品狼友中文久久久| 久久成人18免费网站| 国产AV无码专区亚洲AV手机麻豆| 国产一级婬片A视频免费观看| 亚洲va中文字幕无码久久| 2021在线观看视频精品免费| 亚洲伊人久久大香线蕉AV| 午夜色a大片在线观看免费| 日韩亚洲综合精品国产| 成人亚洲性情网站WWW在线观看| 男人都懂www深夜免费网站| 中文字幕亚洲免费无线观看日本| 99re热免费精品视频观看| 无码亚洲成a人在线观看| 中文字幕亚洲无线码| 37pao成人国产永久免费视频| 亚洲午夜无码久久久久软件| 亚洲AV无码乱码精品国产| 中国国产高清免费av片| 亚洲国产成人在线视频| 免费人成在线观看播放国产| AAA日本高清在线播放免费观看| 亚洲不卡1卡2卡三卡2021麻豆| 国产高清免费的视频| a毛片免费全部在线播放**| 91亚洲国产成人久久精品网址| 国产一区在线观看免费| 人人揉揉香蕉大免费不卡| 亚洲av无码成人影院一区|