A、獲取classpath中的資源:
Java代碼
URL url = this.getClass().getResource("resource_name");
URL url = this.getClass().getClassLoader().getResource("resource_name");
URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name");
那么在jdk中為什么又提供了三種方式來(lái)獲取classpath下的資源呢?這其中是有些來(lái)頭的。
第一行代碼中是利用Class類(lèi)的實(shí)例來(lái)獲取,第二行代碼是使用加載當(dāng)前類(lèi)的classloader來(lái)獲取??聪耲dk中的源代碼會(huì)發(fā)現(xiàn)class類(lèi)的實(shí)例最后還是委托加載他的classloader來(lái)獲取資源的。
Java代碼
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);
}
從上面的代碼中可以看出,對(duì)于資源的加載并沒(méi)有像類(lèi)加載所采用的雙親委托機(jī)制。而是當(dāng)前類(lèi)的classloader不為null的情況下先從當(dāng)前類(lèi)的classloader中加載資源。而只有當(dāng)前類(lèi)的classloader為null的時(shí)候才從system classloader中去加載資源。這樣可以方便我們自定義配置類(lèi)覆蓋一些默認(rèn)配置。當(dāng)然,j2se應(yīng)用中如果沒(méi)有特別定制classloader時(shí),我們自己寫(xiě)的類(lèi)都是被system classloader加載的。到底利用class去獲取資源和利用classloader去獲取資源有什么區(qū)別呢?區(qū)別就在 resolveName(name)這個(gè)方法中。兩種方式對(duì)于資源名稱(chēng)的表示方式不同。下面是一個(gè)簡(jiǎn)單的包結(jié)構(gòu),/表示類(lèi)路徑的根
/
|-com.cn.test
|-Test.class
|-test2.txt
|-test1.txt
Java代碼
// 獲取與當(dāng)前類(lèi)在同一個(gè)包下的資源
URL url1 = this.getClass().getResource("test2.txt");
// 獲取com.cn.test包下的資源,需加/
URL url2 = this.getClass().getResource("/com/cn/test/test2.txt");
// 獲取類(lèi)路徑根下的資源
URL url3 = this.getClass().getClassLoader().getResource("test1.txt");
// 獲取包c(diǎn)om.cn.test包下的資源
URL url4 = this.getClass().getResource("com/cn/test/test2.txt");
而第三利用當(dāng)前線程的contextClassLoader來(lái)獲取資源的解釋可以參考我的另一篇
B、獲取文件系統(tǒng)中的資源
Java代碼
// 1、獲得File對(duì)象
File file = new File("test.txt");
// 2、獲得File對(duì)象的字節(jié)流
InputStream in = new FileInputStream(file);
值得注意的是在File的構(gòu)造函數(shù)File(String name) 中的name參數(shù)可以是相對(duì)路徑和絕對(duì)路徑。相對(duì)路徑是相對(duì)于System.getProperties("user.dir")的。
C、獲取web應(yīng)用中的資源
Java代碼
servletContext.getResourceAsStream(resource_name);
resource_names為相對(duì)于webroot的路徑表示。例如獲取web.xml,resource_name表示為"/WEB-INF/web.xml"
面對(duì)上面介紹的各種資源表現(xiàn)形式和存放位置,難道java中就沒(méi)有提供一個(gè)統(tǒng)一處理方式嗎?有,java.net.URL。
從名稱(chēng)上來(lái)看 URL(Uniform Resource Locator) 統(tǒng)一資源定位器??雌饋?lái)很好很強(qiáng)大。但很多時(shí)候使用它并不能定位到我們需要的資源。
首先,它jdk中體統(tǒng)的URL能訪問(wèn)的協(xié)議非常有限(當(dāng)然可以進(jìn)行擴(kuò)展,不過(guò)很麻煩);常用的有http,file,ftp等等。并沒(méi)有提供對(duì)classpath和servletContext中的資源的獲取方法。
另外,它沒(méi)有提供判斷資源是否存在的方法。每次只有等我們真正去獲取資源的時(shí)候拋出異常才能知道資源無(wú)法獲取。
其次,URL這個(gè)類(lèi)的職責(zé)未劃分清楚,既用來(lái)表示資源有用來(lái)獲取其資源。
聯(lián)系客服