1. 程式人生 > >【第四章】 資源 之 4.2 內建Resource實現 ——跟我學spring3

【第四章】 資源 之 4.2 內建Resource實現 ——跟我學spring3

4.2  內建Resource實現

4.2.1  ByteArrayResource

       ByteArrayResource代表byte[]陣列資源,對於“getInputStream”操作將返回一個ByteArrayInputStream。

首先讓我們看下使用ByteArrayResource如何處理byte陣列資源:

java程式碼:
  1. package cn.javass.spring.chapter4;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import org.junit.Test;  
  5. import
     org.springframework.core.io.ByteArrayResource;  
  6. import org.springframework.core.io.Resource;  
  7. publicclass ResourceTest {  
  8. @Test
  9. publicvoid testByteArrayResource() {  
  10. Resource resource = new ByteArrayResource("Hello World!".getBytes());  
  11.         if(resource.exists()) {  
  12.             dumpStream(resource);  
  13.         }  
  14. }  
  15. }  

是不是很簡單,讓我們看下“dumpStream”實現:

java程式碼:
  1. privatevoid dumpStream(Resource resource) {  
  2.         InputStream is = null;  
  3.         try {  
  4.             //1.獲取檔案資源
  5.             is = resource.getInputStream();  
  6.             //2.讀取資源
  7.             byte[] descBytes = newbyte[is.available()];  
  8.             is.read(descBytes);  
  9.             System.out.println(new String(descBytes));  
  10.         } catch (IOException e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.         finally {  
  14.             try {  
  15.                 //3.關閉資源
  16.                 is.close();  
  17.             } catch (IOException e) {  
  18.             }  
  19.         }  
  20.     }  

    讓我們來仔細看一下程式碼,dumpStream方法很抽象定義了訪問流的三部曲:開啟資源、讀取資源、關閉資源,所以dunpStrean可以再進行抽象從而能在自己專案中使用;byteArrayResourceTest測試方法,也定義了基本步驟:定義資源、驗證資源存在、訪問資源。

       ByteArrayResource可多次讀取陣列資源,即isOpen ()永遠返回false。

1.2.2  InputStreamResource

       InputStreamResource代表java.io.InputStream位元組流,對於“getInputStream ”操作將直接返回該位元組流,因此只能讀取一次該位元組流,即“isOpen”永遠返回true。

       讓我們看下測試程式碼吧:

java程式碼:
  1. @Test
  2. publicvoid testInputStreamResource() {  
  3.    ByteArrayInputStream bis = new ByteArrayInputStream("Hello World!".getBytes());  
  4.    Resource resource = new InputStreamResource(bis);  
  5.     if(resource.exists()) {  
  6.        dumpStream(resource);  
  7.     }  
  8.     Assert.assertEquals(true, resource.isOpen());  
  9. }  

       測試程式碼幾乎和ByteArrayResource測試完全一樣,注意“isOpen”此處用於返回true。

4.2.3  FileSystemResource

       FileSystemResource代表java.io.File資源,對於“getInputStream ”操作將返回底層檔案的位元組流,“isOpen”將永遠返回false,從而表示可多次讀取底層檔案的位元組流。

       讓我們看下測試程式碼吧:

java程式碼:
  1. @Test
  2. publicvoid testFileResource() {  
  3. File file = new File("d:/test.txt");  
  4.     Resource resource = new FileSystemResource(file);  
  5.     if(resource.exists()) {  
  6.         dumpStream(resource);  
  7.     }  
  8.     Assert.assertEquals(false, resource.isOpen());  
  9. }  

       注意由於“isOpen”將永遠返回false,所以可以多次呼叫dumpStream(resource)。

4.2.4  ClassPathResource

       ClassPathResource代表classpath路徑的資源,將使用ClassLoader進行載入資源。classpath 資源存在於類路徑中的檔案系統中或jar包裡,且“isOpen”永遠返回false,表示可多次讀取資源。

       ClassPathResource載入資源替代了Class類和ClassLoader類的“getResource(String name)”和“getResourceAsStream(String name)”兩個載入類路徑資源方法,提供一致的訪問方式。

ClassPathResource提供了三個構造器:

         public ClassPathResource(String path):使用預設的ClassLoader載入“path”類路徑資源;

         public ClassPathResource(String path, ClassLoader classLoader):使用指定的ClassLoader載入“path”類路徑資源;

比如當前類路徑是“cn.javass.spring.chapter4.ResourceTest”,而需要載入的資源路徑是“cn/javass/spring/chapter4/test1.properties”,則將載入的資源在“cn/javass/spring/chapter4/test1.properties”;

         public ClassPathResource(String path, Class<?> clazz):使用指定的類載入“path”類路徑資源,將載入相對於當前類的路徑的資源;

比如當前類路徑是“cn.javass.spring.chapter4.ResourceTest”,而需要載入的資源路徑是“cn/javass/spring/chapter4/test1.properties”,則將載入的資源在“cn/javass/spring/chapter4/cn/javass/spring/chapter4/test1.properties”;

       而如果需要 載入的資源路徑為“test1.properties”,將載入的資源為“cn/javass/spring/chapter4/test1.properties”。

       讓我們直接看測試程式碼吧:

1)使用預設的載入器載入資源,將載入當前ClassLoader類路徑上相對於根路徑的資源:

java程式碼:
  1. @Test
  2. publicvoid testClasspathResourceByDefaultClassLoader() throws IOException {  
  3.    Resource resource = new ClassPathResource("cn/javass/spring/chapter4/test1.properties");  
  4.     if(resource.exists()) {  
  5.         dumpStream(resource);  
  6.     }  
  7.     System.out.println("path:" + resource.getFile().getAbsolutePath());  
  8.     Assert.assertEquals(false, resource.isOpen());  
  9. }  

2)使用指定的ClassLoader進行載入資源,將載入指定的ClassLoader類路徑上相對於根路徑的資源:

java程式碼:
  1. @Test
  2. publicvoid testClasspathResourceByClassLoader() throws IOException {  
  3.     ClassLoader cl = this.getClass().getClassLoader();  
  4.     Resource resource = new ClassPathResource("cn/javass/spring/chapter4/test1.properties" , cl);  
  5.     if(resource.exists()) {  
  6.         dumpStream(resource);  
  7.     }  
  8.     System.out.println("path:" + resource.getFile().getAbsolutePath());  
  9.     Assert.assertEquals(false, resource.isOpen());  
  10. }  

3)使用指定的類進行載入資源,將嘗試載入相對於當前類的路徑的資源:

java程式碼:
  1. @Test
  2. publicvoid testClasspathResourceByClass() throws IOException {  
  3.    Class clazz = this.getClass();  
  4.     Resource resource1 = new ClassPathResource("cn/javass/spring/chapter4/test1.properties" , clazz);  
  5.     if(resource1.exists()) {  
  6.         dumpStream(resource1);  
  7.     }  
  8.     System.out.println("path:" + resource1.getFile().getAbsolutePath());  
  9.     Assert.assertEquals(false, resource1.isOpen());  
  10.     Resource resource2 = new ClassPathResource("test1.properties" , this.getClass());  
  11.     if(resource2.exists()) {  
  12.         dumpStream(resource2);  
  13.    }  
  14.     System.out.println("path:" + resource2.getFile().getAbsolutePath());  
  15.     Assert.assertEquals(false, resource2.isOpen());  
  16. }  

       “resource1”將載入cn/javass/spring/chapter4/cn/javass/spring/chapter4/test1.properties資源;“resource2”將載入“cn/javass/spring/chapter4/test1.properties”;

4)載入jar包裡的資源,首先在當前類路徑下找不到,最後才到Jar包裡找,而且在第一個Jar包裡找到的將被返回:

java程式碼:
  1. @Test
  2. publicvoid classpathResourceTestFromJar() throws IOException {  
  3. Resource resource = new ClassPathResource("overview.html");  
  4.     if(resource.exists()) {  
  5.         dumpStream(resource);  
  6.     }  
  7.     System.out.println("path:" + resource.getURL().getPath());  
  8.     Assert.assertEquals(false, resource.isOpen());  
  9. }  

如果當前類路徑包含“overview.html”,在專案的“resources”目錄下,將載入該資源,否則將載入Jar包裡的“overview.html”,而且不能使用“resource.getFile()”,應該使用“resource.getURL()”,因為資源不存在於檔案系統而是存在於jar包裡,URL類似於“file:/C:/.../***.jar!/overview.html”。

類路徑一般都是相對路徑,即相對於類路徑或相對於當前類的路徑,因此如果使用“/test1.properties”帶字首“/”的路徑,將自動刪除“/”得到“test1.properties”。

4.2.5  UrlResource

       UrlResource代表URL資源,用於簡化URL資源訪問。“isOpen”永遠返回false,表示可多次讀取資源。

       UrlResource一般支援如下資源訪問:

         http:通過標準的http協議訪問web資源,如new UrlResource(“http://地址”);

         ftp:通過ftp協議訪問資源,如new UrlResource(“ftp://地址”);

         file:通過file協議訪問本地檔案系統資源,如new UrlResource(“file:d:/test.txt”);

具體使用方法在此就不演示了,可以參考cn.javass.spring.chapter4.ResourceTest中urlResourceTest測試方法。

4.2.6  ServletContextResource

       ServletContextResource代表web應用資源,用於簡化servlet容器的ServletContext介面的getResource操作和getResourceAsStream操作;在此就不具體演示了。

4.2.7  VfsResource

VfsResource代表Jboss 虛擬檔案系統資源。

Jboss VFS(Virtual File System)框架是一個檔案系統資源訪問的抽象層,它能一致的訪問物理檔案系統、jar資源、zip資源、war資源等,VFS能把這些資源一致的對映到一個目錄上,訪問它們就像訪問物理檔案資源一樣,而其實這些資源不存在於物理檔案系統。

在示例之前需要準備一些jar包,在此我們使用的是Jboss VFS3版本,可以下載最新的Jboss AS 6x,拷貝lib目錄下的“jboss-logging.jar”和“jboss-vfs.jar”兩個jar包拷貝到我們專案的lib目錄中並新增到“Java Build Path”中的“Libaries”中。

讓我們看下示例(cn.javass.spring.chapter4.ResourceTest):

java程式碼:
  1. @Test
  2. publicvoid testVfsResourceForRealFileSystem() throws IOException {  
  3. //1.建立一個虛擬的檔案目錄
  4. VirtualFile home = VFS.getChild("/home");  
  5. //2.將虛擬目錄對映到物理的目錄
  6. VFS.mount(home, new RealFileSystem(new File("d:")));  
  7. //3.通過虛擬目錄獲取檔案資源
  8. VirtualFile testFile = home.getChild("test.txt");  
  9. //4.通過一致的介面訪問
  10. Resource resource = new VfsResource(testFile);  
  11. if(resource.exists()) {  
  12.         dumpStream(resource);  
  13. }  
  14. System.out.println("path:" + resource.getFile().getAbsolutePath());  
  15. Assert.assertEquals(false, resource.isOpen());         
  16. }  
  17. @Test
  18. publicvoid testVfsResourceForJar() throws IOException {  
  19. //1.首先獲取jar包路徑
  20.     File realFile = new File("lib/org.springframework.beans-3.0.5.RELEASE.jar");  
  21.     //2.建立一個虛擬的檔案目錄
  22.     VirtualFile home = VFS.getChild("/home2");  
  23.     //3.將虛擬目錄對映到物理的目錄
  24. VFS.mountZipExpanded(realFile, home,  
  25. TempFileProvider.create("tmp", Executors.newScheduledThreadPool(1)));  
  26. //4.通過虛擬目錄獲取檔案資源
  27.     VirtualFile testFile = home.getChild("META-INF/spring.handlers");  
  28.     Resource resource = new VfsResource(testFile);  
  29.     if(resource.exists()) {  
  30.             dumpStream(resource);  
  31.     }  
  32.     System.out.println("path:" + resource.getFile().getAbsolutePath());  
  33.     Assert.assertEquals(false, resource.isOpen());  
  34. }  

       通過VFS,對於jar裡的資源和物理檔案系統訪問都具有一致性,此處只是簡單示例,如果需要請到Jboss官網深入學習。

相關推薦

資源 4.2 Resource實現 ——spring3

4.2  內建Resource實現 4.2.1  ByteArrayResource        ByteArrayResource代表byte[]陣列資源,對於“getInputStream”操作將返回一個ByteArrayInputStream。 首先讓我們看下使用ByteArrayResource如

資源 4.4 Resource萬用字元路徑 ——spring3

4.4.1  使用路徑萬用字元載入Resource        前面介紹的資源路徑都是非常簡單的一個路徑匹配一個資源,Spring還提供了一種更強大的Ant模式萬用字元匹配,從能一個路徑匹配一批資源。        Ant路徑萬用字元支援“?”、“*”、“**”,注意萬用字元匹配不包括目錄分隔符“/”:

DI 3.4 Bean的作用域與生命週期

3.4  Bean的作用域         什麼是作用域呢?即“scope”,在面向物件程式設計中一般指物件或變數之間的可見範圍。而在Spring容器中是指其建立的Bean物件相對於其他Bean物件的請求可見範圍。       Spring提供“singleton”和“p

DI 3.4 Bean的作用域 ——spring3

3.4  Bean的作用域        什麼是作用域呢?即“scope”,在面向物件程式設計中一般指物件或變數之間的可見範圍。而在Spring容器中是指其建立的Bean物件相對於其他Bean物件的請求可見範圍。 Spring提供“singleton”和“prototype”兩種基本作用域,另外提供“req

MySQL日誌文件管理

文件目錄 mysqld 關閉 heap lib IE tput 列表 自帶 1、日誌文件管理概述: 配置文件:/etc/my.cnf 作用:MySQL日誌文件是用來記錄MySQL數據庫客戶端連接情況、SQL語句的執行情況以及錯誤信息告示。 分類:MySQL日誌文件分為

NB-IoT模組BC95 利用串列埠除錯助手接入華為(電信)平臺

BC95的Coap測試需要雲平臺配合,當前的支援Coap協議的平臺有華為OceanConnect平臺、電信天翼雲(除了logo其他和華為的一樣)、移動OneNet。此教程以華為的OceanConnect平臺為例進行測試。下面我將就平臺申請、平臺測開發、EVB_M1與平

AOP 6.3 基於Schema的AOP

6.3  基於Schema的AOP   基於Schema的AOP從Spring2.0之後通過“aop”名稱空間來定義切面、切入點及宣告通知。     在Spring配置檔案中,所以AOP相關定義必須放在<aop:config>標籤下,該標籤下可以有<ao

好媽媽培養良好的學習習慣

在培養“好習慣”過程中如果方法用的不對,恰恰就培養了壞習慣。方法用對了,好習慣就是水到渠成的事。正確的方法,其實遠比錯誤的方法簡單易做。 1.“不陪”才能培養好習慣  家長陪孩子學習 的時間越長,扮演的角色越接近監工。而孩子從骨子裡是不喜歡一個監工的,他最多表面上暫時屈從他,內心絕不會聽他的話。

數據更新 4-2 數據的刪除

第四章 inf bsp 刪除 group by 執行 bubuko info 語句 一、DROP TABLE語句和DELETE語句 DROP TABLE語句會將表完全刪除。 DELETE語句會留下表(容器),二而刪除表中的全部數據。 二、DELETE語句的基本語法

第二 IoC 2.2 IoC 容器基本原理 ——Spring3

2.2.1  IoC容器的概念 IoC容器就是具有依賴注入功能的容器,IoC容器負責例項化、定位、配置應用程式中的物件及建立這些物件間的依賴。應用程式無需直接在程式碼中new相關的物件,應用程式由IoC容器進行組裝。在Spring中BeanFactory是IoC容器的實際代表者。 Spring IoC容器如

計算機網路 網路層(4

六.ICMP 1. 網際網路控制報文協議ICMP (1)功能:支援主機或路由器做差錯(或異常)報告,網路探詢 (2)兩類ICMP報文   ·差錯報告報文(5種):目的不可達、源抑制、超時/超期、引數問題、重定向   ·網路探詢報文(2組):回聲(Echo)請求與應答(Reply)報文、時間戳請求與應

Spring的事務 9.4 宣告式事務

9.4.1  宣告式事務概述        從上節程式設計式實現事務管理可以深刻體會到程式設計式事務的痛苦,即使通過代理配置方式也是不小的工作量。        本節將介紹宣告式事務支援,使用該方式後最大的獲益是簡單,事務管理不再是令人痛苦的,而且此方式屬於無侵入式,對業

Spring表示式語言 5.4在Bean定義中使用EL—spring3

5.4.1  xml風格的配置        SpEL支援在Bean定義時注入,預設使用“#{SpEL表示式}”表示,其中“#root”根物件預設可以認為是ApplicationContext,只有ApplicationContext實現預設支援SpEL,獲取根物件屬

Python開發:Python基礎函數

nco pos *args 更強 三元 sequence hunk ins att 三元運算 三元運算(三目運算),是對簡單的條件語句的縮寫。 # 書寫格式 result = 值1 if 條件 else 值2 # 如果條件成立,那麽將 “值1” 賦值給result

ASP.NET MVC快速入門完整示例(MVC5+EF6)

redirect name php sql語句 rop 方法 輸入框 一次 編輯 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門

SAP ABAP7.50 CREATE DATA

更多內容關注公眾號:SAP Technical 建立內部表和型別i的資料物件。 資料物件在使用之前直接建立,然後由引用變數初始化並傳遞給收集器。 通過解除引用資料引用來訪問資料物件。 如果未指定任何TYPE或LIKE,則必須完全鍵入資料引用變數dref。 然後使用資料引用變數的靜態

Python14:Python快取 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之快取 RabbitMQ、Redis、Memcache、SQLAlchemy 一、Memcached Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Mem

對ORM的支援 8.1 概述

8.1  概述 8.1.1  ORM框架        ORM全稱物件關係對映(Object/Relation Mapping),指將Java物件狀態自動對映到關係資料庫中的資料上,從而提供透明化的持久化支援,即把一種形式轉化為另一種形式。        物件與關係資料

Spring的事務 9.3 程式設計式事務

9.3.1  程式設計式事務概述         所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。        Spring框架提供一致的事務抽象,因此對於JDBC還是JTA事務都是採用相同的API進行程式設計。 Connectio

C++ Primer 標準庫型別

預設建構函式(default constructor)就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有形參提供預設實參的建構函式定義。如果定義某個類的變數時沒有提供初始化式,就會使用預設建構函式。如果使用者定義的類中沒有顯式定義任何建構函式,編譯器就會自動為該類生成預設建構函式,