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

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

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

    bitbit

     

    java資源獲取分析

    在開發java程序的過程中,我們經常要做的一件事就是獲取資源。那么什么是資源呢?說白了,在計算機里那就是一堆數據。只是這堆數據對我們的java程序有多種表現形式,一般來說有File,URL,InputStream等等。而單就文件這一項就有很多種:配置文件,java類文件,jps文件,圖片、css、js文件等等。面對這林林總總的資源,我們在設計一個讀取資源的接口時,就需要針對不同形式的資源提供方法,這樣就導致我們的接口還是與實際的資源形式綁定在一起,未能完全的抽象。另外,在java程序中資源的存放位置也是各異的。有的存放在classpath中,有的存放在文件系統中,有的存放在web應用中。而對于不同位置的資源,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");  
    甜性澀愛下載 http://www.bt285.cn/content.php?id=1196863 
    那么在jdk中為什么又提供了三種方式來獲取classpath下的資源呢?這其中是有些來頭的。 
    第一行代碼中是利用Class類的實例來獲取,第二行代碼是使用加載當前類的classloader來獲取??聪耲dk中的源代碼會發現class類的實例最后還是委托加載他的classloader來獲取資源的。 
    Java代碼 
    /** 
    * 色即是空2下載  http://www.bt285.cn/sejishikong/ 
    愛的色放下載 http://www.bt285.cn/aidesefang/ 
    */ 
    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);  
     

    從上面的代碼中可以看出,對于資源的加載并沒有像類加載所采用的雙親委托機制。而是當前類的classloader不為null的情況下先從當前類的classloader中加載資源。而只有當前類的classloader為null的時候才從system classloader中去加載資源。這樣可以方便我們自定義配置類覆蓋一些默認配置。當然,j2se應用中如果沒有特別定制classloader時,我們自己寫的類都是被system classloader加載的。到底利用class去獲取資源和利用classloader去獲取資源有什么區別呢?區別就在 resolveName(name)這個方法中。兩種方式對于資源名稱的表示方式不同。下面是一個簡單的包結構,/表示類路徑的根 
    / 
    |-com.cn.test 
       |-Test.class 
       |-test2.txt  
    |-test1.txt 
    Java代碼 
    // 獲取與當前類在同一個包下的資源  
    URL url1 = this.getClass().getResource("test2.txt");  
    // 獲取com.cn.test包下的資源,需加/  
    URL url2 = this.getClass().getResource("/com/cn/test/test2.txt");  
    // 獲取類路徑根下的資源  
    URL url3 = this.getClass().getClassLoader().getResource("test1.txt");  
    // 獲取包com.cn.test包下的資源  
    URL url4 = this.getClass().getResource("com/cn/test/test2.txt");  

    而第三利用當前線程的contextClassLoader來獲取資源的解釋可以參考我的另一篇 
    B、獲取文件系統中的資源 
    Java代碼 
    // 1、獲得File對象  
    File file = new File("test.txt");  
    // 2、獲得File對象的字節流  
    InputStream in = new FileInputStream(file);  

    值得注意的是在File的構造函數File(String name) 中的name參數可以是相對路徑和絕對路徑。相對路徑是相對于System.getProperties("user.dir")的。 
    C、獲取web應用中的資源 
    Java代碼 
    servletContext.getResourceAsStream(resource_name);  

    resource_names為相對于webroot的路徑表示。例如獲取web.xml,resource_name表示為"/WEB-INF/web.xml" 

        面對上面介紹的各種資源表現形式和存放位置,難道java中就沒有提供一個統一處理方式嗎?有,java.net.URL。 
    從名稱上來看 URL(Uniform Resource Locator) 統一資源定位器。看起來很好很強大。但很多時候使用它并不能定位到我們需要的資源。 
        首先,它jdk中體統的URL能訪問的協議非常有限(當然可以進行擴展,不過很麻煩);常用的有http,file,ftp等等。并沒有提供對classpath和servletContext中的資源的獲取方法。 
        另外,它沒有提供判斷資源是否存在的方法。每次只有等我們真正去獲取資源的時候拋出異常才能知道資源無法獲取。 
        其次,URL這個類的職責未劃分清楚,既用來表示資源有用來獲取其資源。 

    posted on 2009-11-27 16:33 bt,bt.bt 閱讀(1794) 評論(0)  編輯  收藏

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲午夜高清国产拍精品 | 亚洲成人高清在线观看| 在线免费观看伊人三级电影| 亚洲一级黄色视频| 日本精品久久久久久久久免费| 日韩视频免费在线| 精品视频免费在线| 亚洲一区二区在线免费观看| 不卡视频免费在线观看| 久久精品亚洲视频| 亚洲无码一区二区三区| 成全视频免费高清| 老司机午夜精品视频在线观看免费| 午夜精品一区二区三区免费视频| 久久精品国产精品亚洲蜜月| 日韩插啊免费视频在线观看| 亚洲欧洲精品成人久久奇米网| 2022免费国产精品福利在线| 亚洲精品乱码久久久久久蜜桃不卡 | 免费人成在线观看网站| 亚洲AV区无码字幕中文色| 最近2019免费中文字幕6| 亚洲天堂免费在线| 亚洲成a人无码av波多野按摩| a级毛片在线免费看| 亚洲狠狠狠一区二区三区| 大香人蕉免费视频75| 国产高清对白在线观看免费91 | 成人午夜性A级毛片免费| 在线观看亚洲免费| 国产亚洲成av人片在线观看| 2019中文字幕在线电影免费 | 一区二区免费在线观看| 亚洲AV无码成人精品区蜜桃| 91免费播放人人爽人人快乐| 中文亚洲成a人片在线观看| 91精品全国免费观看含羞草| 亚洲国产无线乱码在线观看| 国产亚洲一区二区三区在线观看| 国产精品成人免费视频网站京东| 国产精品永久免费|