一、概述
spring改進了java資源訪問的策略,Spring爲資源訪問提供了一個Resource接口,該接口提供了更強的資源訪問能力。
Resource接口中主要定義有以下方法:
1、 exists():用於判斷對應的資源是否真的存在。
2、sReadable():用於判斷對應資源的內容是否可讀。需要注意的是當其結果爲true的時候,其內容未必真的可讀,但如果返回false,則其內容必定不可讀。
3、 isOpen():用於判斷當前資源是否代表一個已打開的輸入流,如果結果爲true,則表示當前資源的輸入流不可多次讀取,而且在讀取以後需要對它進行關閉,以防止內存泄露。該方法主要針對於InputStreamResource,實現類中只有它的返回結果爲true,其他都爲false。
l4、 getURL():返回當前資源對應的URL。如果當前資源不能解析爲一個URL則會拋出異常。如ByteArrayResource就不能解析爲一個URL。
5、 getFile():返回當前資源對應的File。如果當前資源不能以絕對路徑解析爲一個File則會拋出異常。如ByteArrayResource就不能解析爲一個File。
6、 getInputStream():獲取當前資源代表的輸入流。除了InputStreamResource以外,其它Resource實現類每次調用getInputStream()方法都將返回一個全新的InputStream。
二、Resource的實現類
1、ClassPathResource可用來獲取類路徑下的資源文件。對於web應用,ClassPathResource可自動搜索位於
WEB-INF/classes下的資源文件,無需使用絕對路徑訪問
package spring;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.core.io.ClassPathResource;
/**
* 訪問加載路徑下的資源
* ClassPathResource可自動搜索位於WEB-INF/classes下的資源文件
*
*/
public class ClassPathResourceTest {
public static void main(String[] args) {
ClassPathResource cpr=new ClassPathResource("book.xml");
//獲取資源的簡單信息
System.out.println(cpr.getFilename()+"========"+cpr.getDescription());
//創建基於Dom4j的解析器
SAXReader reader=new SAXReader();
try {
Document doc= reader.read(cpr.getFile());
Element element=doc.getRootElement();
List listElement=element.elements();
Iterator<Element> it=listElement.iterator();
//遍歷根元素的全部子元素
while(it.hasNext()){
Element el=it.next();
List elList=el.elements();
Iterator<Element> its=elList.iterator();
while(its.hasNext()){
Element element2=its.next();
System.out.println(element2.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
輸出:
book.xml========class path resource [book.xml]
java
javaEE
C
C++
2、 UrlResource可用來代表URL對應的資源,它對URL做了一個簡單的封裝。通過給定一個URL地址,我們就能構建一個UrlResource。URL資源通常應該提供標準的協議前綴
file:用於訪問文件系統
http:用於訪問基於HTTP協議的網絡資源
ftp:用於訪問基於FTP協議的網絡資源
package spring;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.core.io.UrlResource;
/**
* 訪問網絡資源
*
*/
public class UrlResourceTest {
public static void main(String[] args) {
try {
//創建一個Resource對象,指定從文件系統裏讀取資源
UrlResource url=new UrlResource("file:D:/workspaces/onlineShop/WebRoot/WEB-INF/classes/applicationContext.xml");
//獲取該資源的簡單信息
System.out.println(url.getFilename()+"---------"+url.getDescription());
//創建基於Dom4j的解析器
SAXReader reader=new SAXReader();
try {
Document document= reader.read(url.getFile());
Element element= document.getRootElement();
List list=element.elements();
Iterator<Element> it=list.iterator();
while (it.hasNext()) {
List list2=it.next().elements();
Iterator<Element> it2=list2.iterator();
while (it2.hasNext()) {
Element element2=it2.next();
System.out.println(element2.getName());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、 ByteArrayResource是針對於字節數組封裝的資源,它的構建需要一個字節數組。
package spring;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.core.io.ByteArrayResource;
/**
* 訪問字節數組資源
*
*/
public class ByteArrayResourceTest {
public static void main(String[] args) {
String file="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+"<books>"
+"<book name=\"Chinese\"><name>java</name><type>javaEE</type></book>"
+ "<book name=\"English\"><name>C</name><type>C++</type> </book>"
+"</books>";
byte[]fileBytes=file.getBytes();
ByteArrayResource bar=new ByteArrayResource(fileBytes);
System.out.println(bar.getDescription());
SAXReader reader=new SAXReader();
try {
Document doc= reader.read(bar.getInputStream());
Element element=doc.getRootElement();
List listElement=element.elements();
Iterator<Element> it=listElement.iterator();
while(it.hasNext()){
Element el=it.next();
List elList=el.elements();
Iterator<Element> its=elList.iterator();
while(its.hasNext()){
Element element2=its.next();
System.out.println(element2.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4、ServletContextResource是針對於ServletContext封裝的資源,用於訪問ServletContext環境下的資源。ServletContextResource持有一個ServletContext的引用,其底層是通過ServletContext的getResource()方法和getResourceAsStream()方法來獲取資源的。
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@page import="org.springframework.web.context.support.ServletContextResource"%>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@page import="org.springframework.context.ApplicationContext"%>
<%@page import="org.dom4j.*" %>
<%@page import="java.io.*" %>
<%@page import="org.dom4j.io.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
ServletContextResource src=new ServletContextResource(application,"WEB-INF/book.xml");
out.print(src.getFilename()+"========"+src.getDescription());
SAXReader reader=new SAXReader();
try {
Document doc= reader.read(src.getFile());
Element element=doc.getRootElement();
List listElement=element.elements();
Iterator<Element> it=listElement.iterator();
while(it.hasNext()){
Element el=it.next();
List elList=el.elements();
Iterator<Element> its=elList.iterator();
while(its.hasNext()){
Element element2=its.next();
out.println(element2.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title></title>
</head>
<body>
</body>
</html>