Spring資源抽象接口
?
JDK所提供的訪問(wèn)資源的類(如java.net.URL、File等)并不能很好地滿足各種底層資源的訪問(wèn)需求,比如缺少?gòu)念惵窂交蛘遅eb容器的上下文獲取資源的操作類。有鑒于此,Spring設(shè)計(jì)了一個(gè)Resource接口,它為應(yīng)用提供了更強(qiáng)的訪問(wèn)底層資源的能力。該接口擁有對(duì)應(yīng)不同資源類型的實(shí)現(xiàn)類。先來(lái)了解一下Resource接口的主要方法:
?
?
public interface InputStreamSource { //每次調(diào)用都將返回一個(gè)新鮮的資源對(duì)應(yīng)的java.io. InputStream字節(jié)流, //調(diào)用者在使用完畢后必須關(guān)閉該資源。 InputStream getInputStream() throws IOException; }
?
?
public interface Resource extends InputStreamSource { //資源是否存在。 boolean exists(); //是否可以讀 boolean isReadable(); //資源是否打開(kāi) boolean isOpen(); //如果底層資源可以表示為urL,則返回url對(duì)象 URL getURL() throws IOException; URI getURI() throws IOException; //如果底層資源對(duì)應(yīng)的一個(gè)文件,該方法返回對(duì)應(yīng)的File對(duì)象 File getFile() throws IOException; //返回當(dāng)前Resource代表的底層文件資源的長(zhǎng)度,一般是值代表的文件資源的長(zhǎng)度。 long contentLength() throws IOException; //最后修改時(shí)間 long lastModified() throws IOException; //通過(guò)path 得到一個(gè)Resource對(duì)象 Resource createRelative(String relativePath) throws IOException; //獲取資源名稱 String getFilename(); //資源描述 String getDescription(); }
?
Resource在spring框架中起著不可或缺的作用,spring框架使用Resource裝在各種資源,這些資源包括配置文件資源、國(guó)際化屬性文件資源等。下面我們來(lái)了解一下Resource的具體實(shí)現(xiàn)類,如下圖
?
1.ByteArrayResource:二進(jìn)制數(shù)組表示的資源,二進(jìn)制數(shù)組資源可以在內(nèi)存中通過(guò)程序構(gòu)造
?
2.ClassPathResource:類路徑下的資源
?
3.FileSystemResource: 文件系統(tǒng)資源
?
4.InputStreamResource: 輸入流返回表示資源
?
5.ServletContextResource: 基于web容器上下文資源
?
6.UrlResource: 對(duì)java.io.URL的封裝,可以表示很多的協(xié)議的網(wǎng)絡(luò)資源(http,ftp,文件系統(tǒng)資源)
?
有了這個(gè)抽象的資源類后,我們就可以將spring的配置信息放置在任何地方,只要最終可以通過(guò)Resource接口返回配置信息即可
?
7.PortletContextResource: 基于web容器上下文資源
?
8.DescriptiveResource:
?
假如有一個(gè)文件位于web應(yīng)用的類路徑下,用戶可以通過(guò)以下方式對(duì)這個(gè)資源進(jìn)行訪問(wèn):
?
1.通過(guò)FileSystemResource以文件系統(tǒng)絕對(duì)路徑的方式進(jìn)行訪問(wèn)
?
2.通過(guò)ClassPathResource以類路徑的方式進(jìn)行訪問(wèn)
?
3.通過(guò)ServletContextResource以相對(duì)于Web應(yīng)用根目錄的方式進(jìn)行訪問(wèn)
?
下面,我們分別通過(guò)FileSystemResource和ClassPathResource訪問(wèn)同一個(gè)文件資源:
?
?
package com.fortune.test.resource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import java.io.IOException; import java.io.InputStream; /** * Created with IntelliJ IDEA. * User: Alan * Date: 12-5-18 * Time: 上午10:58 */ public class FileSourceExample { public static void main(String args[]){ try{ String filePath ="D:/maskerSpring/chapter3/WebRoot/WEB-INF/classes/conf/file1.txt"; //①使用系統(tǒng)文件路徑方式加載文件 Resource res1 = new FileSystemResource(filePath); //②使用類路徑方式加載文件 Resource res2 = new ClassPathResource("/conf/file1.txt"); InputStream ins1 = res1.getInputStream(); InputStream ins2 = res2.getInputStream(); System.out.println("res1:"+res1.getFilename()); System.out.println("res2:"+res2.getFilename()); }catch (IOException e){ e.printStackTrace(); } } }?
在獲得資源后,用戶就可以通過(guò)Resource接口定義的多個(gè)方法訪問(wèn)文件的數(shù)據(jù)和其它的信息:
?
如可以通過(guò)getFileName()直接獲取文件的輸入流。此外,還可以通過(guò)createRelative(String relativePath)在資源相對(duì)地址上創(chuàng)建新的文件。
?
在Web應(yīng)用中,用戶還可以通過(guò)ServletContextResource以相對(duì)于Web應(yīng)用根目錄的方式訪問(wèn)文件資源,如下所示:
?
?
<%@ page import="org.springframework.core.io.Resource" %> <%@ page import="org.springframework.web.context.support.ServletContextResource" %> <%@ page import="org.springframework.web.util.WebUtils" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% //①注意文件資源地址以相對(duì)于Web應(yīng)用根路徑的方式表示 Resource res3 = new ServletContextResource(application,"/WEB-INF/classes/conf/file1.txt"); out.print(res3.getFilename()+"<br/>"); out.print(WebUtils.getTempDir(application).getAbsolutePath()); %>
?
對(duì)于位于遠(yuǎn)程服務(wù)器(Web服務(wù)器或FTP服務(wù)器)的文件資源,用戶可以方便地通過(guò)UrlResource進(jìn)行訪問(wèn)。
?
資源加載時(shí)默認(rèn)采用系統(tǒng)編碼讀取資源內(nèi)容,如果資源文件采用特殊的編碼格式,那么可以通過(guò)EncodedResource對(duì)資源進(jìn)行編碼,以保證資源內(nèi)容操作的正確性:
?
?
package com.fortune.test.resource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; import org.springframework.util.FileCopyUtils; /** * Created with IntelliJ IDEA. * User: Alan * Date: 12-5-18 * Time: 下午12:15 */ public class EncodedResourceExample { public static void main(String args[]) throws Throwable { Resource res = new ClassPathResource("conf/file1.txt"); EncodedResource encRes = new EncodedResource(res, "UTF-8"); String content = FileCopyUtils.copyToString(encRes.getReader()); System.out.println(content); } }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
