Java載入資源檔時的路徑問題的解決辦法

來源:互聯網
上載者:User

載入資源檔比較常用的有兩種:

一、用ClassLoader,說到這裡就不得不提一下ClassLoader的分類,java內建的ClassLoader主要有三種,

第一種是根類載入器(bootstrap class loader),用C++來編寫,負責將一些關鍵的Java類,如java.lang.Object和其他一些運行時代碼先載入進記憶體中。 所負責載入的包:BootStrp------>JRE/lib/rt.jar

第二種是擴充類載入器(ExtClassLoader),由java類編寫,負責將JRE中的一些類載入進記憶體中。所負責載入的包: ExtClassLoader---------->JRE/lib/ext/*.jar

第三種是應用類載入器(AppClassLoader)或者叫做系統類別載入器,負責將CLASSPATH中的類載入到記憶體中。可以通過ClassLoader.getSystemClassLoader()來擷取應用類載入器;

再來所說加類載器的繼承,類載入器不是垂直繼承的父子關係,而是一種組合關係,可以通過執行個體化類載入器時,將父類載入器的執行個體作為構造參數傳到類載入器中。

關於類載入器的詳細資料,可以自行搜尋。

擷取到應用類載入器之後,就是擷取資源檔了,調用loader.getResource(path)可以載入相應路徑下的資源檔,不能以‘/'開頭,關於包內的資源可以把包當做普通的檔案夾,以'/'分隔每個包。

如:URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser");是擷取demo包內的names.ser序列化檔案。

二、用需要載入的當前類的getResource方法來載入,其實這個方法也是調用的載入這個類的類載入器來獲得資源檔的,只不過是擷取的參數不同。

(1)要想擷取class所在包內的檔案可以用相對路徑直接存取包內的資源;如:Demo1.class.getResource("names.ser");擷取的是Demo1的class檔案所在包內的資源

(2)要想擷取包外的資源檔必須以‘/'開頭,如URL url = Demo1.class.getResource("/demo/names.ser");擷取的是demo包內的names.ser檔案

其實第二種方式是對第一種方式的一個封裝,都是用的ClassLoader來載入的資源檔。為什麼這麼說呢?看一下Class類的源碼就知道:

複製代碼 代碼如下: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);
}

複製代碼 代碼如下: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根據傳進來的name值(即相對路徑或者絕對路徑的形式),我們看到經過resolveName處理之後就調用了ClassLoader c1進行了載入,ClassLoader的載入路徑的形式是不以‘/'開頭的相對路徑,那肯定是resolveName把路徑轉換了一把,再看看resolveName方法,首先判斷是不是以‘/'開頭,如果以‘/'開頭,則為相對路徑,否則就是絕對路徑,注意else這個代碼塊,它將第一個字元去除掉了,確實去除掉之後就符合了ClassLoader的載入路徑,而if塊中就根據把當前類的包路徑截取,然後將.替換成了'/',並添加上那段相對路徑,也形成了符合ClassLoader的載入路徑。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.