国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
java資源獲取分析
 在開(kāi)發(fā)java程序的過(guò)程中,我們經(jīng)常要做的一件事就是獲取資源。那么什么是資源呢?說(shuō)白了,在計(jì)算機(jī)里那就是一堆數(shù)據(jù)。只是這堆數(shù)據(jù)對(duì)我們的java程序有多種表現(xiàn)形式,一般來(lái)說(shuō)有File,URL,InputStream等等。而單就文件這一項(xiàng)就有很多種:配置文件,java類(lèi)文件,jps文件,圖片、css、js文件等等。面對(duì)這林林總總的資源,我們?cè)谠O(shè)計(jì)一個(gè)讀取資源的接口時(shí),就需要針對(duì)不同形式的資源提供方法,這樣就導(dǎo)致我們的接口還是與實(shí)際的資源形式綁定在一起,未能完全的抽象。另外,在java程序中資源的存放位置也是各異的。有的存放在classpath中,有的存放在文件系統(tǒng)中,有的存放在web應(yīng)用中。而對(duì)于不同位置的資源,java程序獲取這些資源的方法各有不同。

    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)獲取其資源。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
getClass()和getClassLoader()區(qū)別 以及ClassLoader詳解及用途(文件加載,類(lèi)加載)
Class.getResource和ClassLoader.getResource的區(qū)別分析
徹底搞懂Class.getResource和ClassLoader.getResource的區(qū)別和底層原理
Java路徑的最終解決方案:相對(duì)路徑尋址 — IT技術(shù)
JVM系列(二):JVM中類(lèi)加載器相關(guān)知識(shí)筆記
Ken Wu's Blog ? java類(lèi)加載器體系結(jié)構(gòu)(含hotswap原理)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服