Spring的資源訪問

一、概述
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>
發佈了91 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章