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來獲取。看下jdk中的源代碼會發現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 閱讀(1790) 評論(0)  編輯  收藏

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 青阳县| 涞源县| 临江市| 赤水市| 进贤县| 广南县| 望都县| 获嘉县| 台山市| 麻阳| 固阳县| 铜山县| 平谷区| 鄂温| 麟游县| 石屏县| 沂源县| 泗水县| 柘城县| 宜兴市| 湘西| 沂南县| 芷江| 南昌市| 吉隆县| 锦州市| 桃江县| 内丘县| 内黄县| 贞丰县| 抚松县| 吉水县| 湾仔区| 涞水县| 盖州市| 东辽县| 吴桥县| 襄垣县| 河东区| 灵石县| 大厂|