classloader.getresources() 介紹

轉載自: https://www.cnblogs.com/bhlsheji/p/4095699.html

◆普通情況下,我們都使用相對路徑來獲取資源,這種靈活性比較大.

比方當前類為com/bbebfe/Test.class

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

而假設這些圖像資源放置在icons文件夾下,則應該是com/bbebfe/icons/sample.gif

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

· 如果當前類為com.bbebfe.Test

· 包所在的目錄為bin

String imageName?= "icons/sample.gif"

1,?通過Class.getResource()定位類路徑下的資源(bin/com/bbebfe/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()方法中會對資源名稱作一定的處理,?這在上面介紹了,?以下舉個實例:

???????如果我的當前類在EclipseprojectDatabase下,?類所在的包是com.bbebfe.test,?而icons文件夾放在bin/com/bbebfe/test/文件夾下,?我須要得到icons/sample.gif文件的URL,?則調用this.getClass().getResource()得到的URL是:

??????file:/E:/MyLife/MyProjects/Eclipse3.2/Database/bin/com/bbebfe/test/icons/disremove.gif

?

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

·某個project有例如以下的包結構:

?????? com.bbebfe.ui

?????? com.bbebfe.test

?????? com.bbebfe.database

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

?????? com.bbebfe.ui/icons/...

?????? com.bbebfe.test/icons/...

?????? com.bbebfe.database/icons/...

·而我們可能希望在根文件夾下放置一個icons文件夾,?把全部資源放置在這里管理,?這樣還能夠防止資源的反復.?就是例如以下形式

?????? com.bbebfe.ui

?????? com.bbebfe.test

?????? com.bbebfe.database

???????icons/sample.gif ...

???????則此時我們應該調用ClassLoader.getResource方法,?因為它沒有對資源名稱作處理,?也就是說沒有將修正的包名加入到資源名稱前,?所以它會在類所在的包的根下去查找資源.(執行java程序的語法是java com.bbebfe.ui.Test,?所以根文件夾是com文件夾的上級文件夾).

?

◆最后,?在Java中對資源進行定位的方法有非常多種,?在Eclipse源碼中還有例如以下一段定位文件資源的代碼,?還沒有時間研究,?以后再談:

ProtectionDomain?domain = Main.class.getProtectionDomain();

CodeSource?source = null;

URL?result = null;

if (domain != null)

source = domain.getCodeSource();//獲得code source

if (source != null)

????? result = source.getLocation();//獲得URL

??????????

String path = decode(result.getFile());//

// normalize to not have leading / so we can check the form

File file = new File(path);

path = file.toString().replace('""', '/');

// create a file URL (via File) to normalize the form (e.g., put

// the leading / on if necessary)

path = new File(path).toURL().getFile();

?

?

剛才試了一下,發現假設類路徑上有反復的資源,getResource()方法會返回類路徑上碰到的第一個資源。?

而getResources()則會返回當前類載入器路徑上的全部反復資源以及父類載入器上的全部反復資源。?

比方,在tomcat/lib文件夾下放置一個zip文件,包括config/aaa.txt文件,?
在WEB-INF/lib文件夾下復制一份這個zip文件,?
再在src文件夾下放上config/aaa.txt文件,?

getResource("config/aaa.txt")返回結果是:?
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt?

getResources("config/aaa.txt")返回結果是:?
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt?
jar:file:/D:/apache-tomcat-6.0.16/lib/aaaaa.jar!/config/aaa.txt?
jar:file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/lib/bbbbb.jar!/config/aaa.txt?

轉載于:https://www.cnblogs.com/FengZeng666/p/10850179.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Anti-Aliasing SSAA MSAA MLAA SRAA 簡介

http://blog.csdn.net/codeboycjy/article/details/6312758 前兩天在瀏覽游民星空的時候,小編居然在文章中掛了一篇技術文章,是關于SRAA的。對于AA的了解很少,正好入職之前還有幾天的空閑時間,所以就這個機會把AA的一些基本算法簡…

MyBatis多數據源配置(讀寫分離)

MyBatis多數據源配置(讀寫分離) 首先說明,本文的配置使用的最直接的方式,實際用起來可能會很麻煩。 實際應用中可能存在多種結合的情況,你可以理解本文的含義,不要死板的使用。 多數據源的可能情況 1.主從 通常是MySQL一主多…

UI簡單工作

UI用戶界面 需求——效果圖——風格設計——高保證效果——html 網頁的寬度屏幕的寬度-縱向滾動條的寬度 企業網站一般是1280 根據百度流量研究所 目前我們的網頁注主要是1024和1200 這樣的寬度符合大體市場 首屏高度。 首屏的概念來源于出版領域 報紙折疊后販賣&…

MySQL分庫分表總結

MySQL分庫分表總結: 單庫單表 : 單庫單表是最常見的數據庫設計,例如,有一張用戶(user)表放在數據庫db中,所有的用戶都可以在db庫中的user表中查到。 單庫多表 : 隨著用戶數量的增加,user表的數…

3章 RxJava操作符

本篇文章已授權微信公眾號 YYGeeker 獨家發布轉載請標明出處 CSDN學院課程地址 RxJava2從入門到精通-初級篇:edu.csdn.net/course/deta…RxJava2從入門到精通-中級篇:edu.csdn.net/course/deta…RxJava2從入門到精通-進階篇:edu.csdn.net/course/deta…RxJava2從入門到精通-源碼…

virtualbox 使用

實現文件拖拽功能 1、設備 -- 安裝增強功能 -- /bin/sh VboxLinuxaddition.run -- reboot 2、設備 -- 拖放 -- 雙向 3、虛擬機 -- 設置 -- 存儲 -- 控制器:SATA -- 勾選 使用主機輸入輸出(I\O 緩存) 4、虛擬機硬盤 -- 勾選固態驅動器 轉載于…

linux安裝mysql 5.6.33

.到MySQL官網下載mysql編譯好的二進制安裝包,在下載頁面Select Platform:選項選擇linux-generic,然后把頁面拉到底部,64位系統下載Linux - Generic (glibc 2.5) (x86, 64-bit),下載后文件名:mysql-5.6.33-linux-glibc2…

Go 函數特性和網絡爬蟲示例

爬取頁面 這篇通過網絡爬蟲的示例,來了解 Go 語言的遞歸、多返回值、延遲函數調用、匿名函數等方面的函數特性。首先是爬蟲的基礎示例,下面兩個例子展示通過 net/http 包來爬取頁面的內容。 獲取一個 URL 下面的程序展示從互聯網獲取信息,獲…

Qt的安裝和使用中的常見問題(詳細版)

對于太長不看的朋友,可參考Qt的安裝和使用中的常見問題(簡略版)。 目錄 1、引入2、Qt簡介3、Qt版本 3.1 查看安裝的Qt版本3.2 查看當前項目使用的Qt版本3.3 查看當前項目使用的QtCreator版本3.4 Linux命令行下查看和使用不同版本的Qt4、Qt模塊…

python與C#的互相調用

python與C#的互相調用一、C#調用python新建一個項目,添加引用:IronPython.dll,Microsoft.Scripting.dll(在IronPython的安裝目錄中)。創建一個文本文件命名為hello.py,把該文件添加的當前的項目中,并設置為總是輸出。#…

各行業大數據可視化界面參考

轉載于:https://www.cnblogs.com/wangsongbai/p/10178096.html

mysql遠程連接 Host * is not allowed to connect to this MySQL server

localhost改成% 進入mysql的BIN目錄 代碼如下 復制代碼 mysql -u root -p mysql>use mysql; mysql>update user set host ’%where user ’root’; mysql>flush privileges; 具體分析 1、在本機登入mysql后,更改“mysql”數據庫里的“user”表里的“h…

今日聽聞這幾款手機軟件比較火爆 果然名不虛傳!

如今的時代,智能手機已經成為我們生活中不可缺少的一部分,大家之所以這么愛玩手機,其實并不是手機本身有多么吸引人,而是安裝在手機上的各種各樣的APP,比如各種社交軟件、音頻軟件、購物軟件以及地圖軟件等等。下面我們…

setdefault()方法

setdefault()方法 描述 字典 setdefault() 方法和 get()方法類似,返回指定鍵的值,如果鍵不在字典中,將會添加鍵并將值設置為一個指定值,默認為None。 get() 和 setdefault() 區別: setdefault() 返回的鍵如果不在字典中&#xff0…

Hive2.1.1、Hadoop2.7.3 部署

本文以遠程模式安裝Hive2.1.1將hive的元數據放置在MySQL數據庫中。 1 安裝mysql數據庫 sudo apt-get install mysql-server11 重啟mysql服務使得配置文件生效 sudo service mysql restart11 創建hive專用賬戶 CREATE USER hive% IDENTIFIED BY 123456;11 給hive賬戶授予所有權限…

Django 的簡單ajax

需要通過ajax實現局部刷新 js代碼 $(#guo-sou-ajax).click(function(){ #獲取id為guo-sou-ajax點擊后的信號console.log($(this).attr("data-action")) $.ajax({ #調用ajaxurl: $(this).attr("data-action"), #url保存在標簽里面的data-actio…

postman提取返回值

Postman是做接口測試的,但是很多接口并不是直接就能測,有的需要一些預處理。比如說身份認證,需要傳遞一個token。如果做網頁測試,一般打開登陸界面的時候就會生成一個token,如果返回值是json格式,用Postman…

docker下用keepalived+Haproxy實現高可用負載均衡集群

啟動keepalived后宿主機無法ping通用keepalived,報錯: [rootlocalhost ~]# ping 172.18.0.15 PING 172.18.0.15 (172.18.0.15) 56(84) bytes of data. From 172.18.0.1 icmp_seq1 Destination Host Unreachable From 172.18.0.1 icmp_seq2 Destination H…

hadoop hive 2.1.1 將Hive啟動為服務

我們之前使用的Shell方式與Hive交互只是Hive交互方式中的一種,還有一種就是將Hive啟動為服務,然后運行在一個節點上,那么剩下的節點就可以使用客戶端來連接它,從而也可以使用Hive的數據分析服務。 前臺模式 可以使用下面的命令來將…

大數據學習要知道的十大發展趨勢,以及學習大數據的幾點建議

2016年,近40%的公司正在實施和擴展大數據技術應用,另有30%的公司計劃在未來12個月內采用大數據技術,62.5%的公司現在至少有一個大數據項目投入生產,只有5.4%的公司沒有大數據應用計劃,或者是沒有正在進行的大數據項目&…