码迷,mamicode.com
首页 > 编程语言 > 详细

Spring的Resource 接口及其实现类

时间:2015-11-18 15:40:40      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

  JDK 所提供的访问资源的类(如java.net.URL、File 等)并不能很好地满足各种底层资源的访问需求,比如缺少从类路径或者Web 容器的上下文中获取资源的操作类。有鉴于此,Spring 设计了一个Resource 接口,它为应用提供了更强的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。先来了解一下Resource 接口的主要方法:

  • boolean exists():资源是否存在;
  • boolean isOpen():资源是否打开;
  • URL getURL() throws IOException:如果底层资源可以表示成URL,该方法返回对应的URL 对象;
  • File getFile() throws IOException:如果底层资源对应一个文件,该方法返回对应的File 对象;
  • InputStream getInputStream() throws IOException:返回资源对应的输入流。

  Resource 在Spring 框架中起着不可或缺的作用,Spring 框架使用Resource 装载各种资源,这些资源包括配置文件资源、国际化属性文件资源等。下面我们来了解一下Resource的具体实现类,如图3-5 所示:

技术分享

  • ByteArrayResource:二进制数组表示的资源,二进制数组资源可以在内存中通过程序构造;
  • ClassPathResource:类路径下的资源,资源以相对于类路径的方式表示,如代码清单3-14 所示;
  • FileSystemResource:文件系统资源,资源以文件系统路径的方式表示,如D:/conf/bean.xml 等;
  • InputStreamResource:以输入流返回表示的资源;
  • ServletContextResource:为访问Web 容器上下文中的资源而设计的类,负责以相对于Web 应用根目录的路径加载资源,它支持以流和URL 的方式访问,在WAR 解包的情况下,也可以通过File 的方式访问,该类还可以直接从JAR 包中访问资源;
  • UrlResource:Url 封装了java.net.URL,它使用户能够访问任何可以通过URL 表示的资源,如文件系统的资源、HTTP 资源、FTP 资源等。有了这个抽象的资源类后,我们就可以将Spring 的配置信息放置在任何地方(如数据库、LDAP 中),只要最终可以通过Resource 接口返回配置信息就可以了。

  提示:Spring 的Resource 接口及其实现类可以在脱离Spring 框架的情况下使用,它比通过JDK 访问资源的API 更好用,更强大。

  假设有一个文件位于Web 应用的类路径下,用户可以通过以下方式对这个文件资源进行访问:

  • 通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
  • 通过 ClassPathResource 以类路径的方式进行访问;
  • 通过 ServletContextResource 以相对于Web 应用根目录的方式进行访问。

  相比于通过JDK 的File 类访问文件资源的方式,Spring 的Resource 实现类无疑提供了更加灵活的操作方式,用户可以根据情况选择适合的Resource 实现类访问资源。下面,我们分别通过FileSystemResource 和ClassPathResource 访问同一个文件资源:

代码清单 3-14 FileSourceExample                

   package com.baobaotao.resource;
    import java.io.IOException;
    import java.io.InputStream;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.FileSystemResource;
    import org.springframework.core.io.Resource;
    public class FileSourceExample {
    public static void main(String[] args) {
        try {
            String filePath = "D:/masterSpring/chapter3/WebRoot/WEB-INF/classes/conf/file1.txt";
            //①使用系统文件路径方式加载文件
            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();
        }
     }
  }

  在获取资源后,用户就可以通过Resource 接口定义的多个方法访问文件的数据和其他的信息:如可以通过getFileName()获取文件名,通过getFile()获取资源对应的File 对象,通过getInputStream()直接获取文件的输入流。此外,还可以通过createRelative(StringrelativePath)在资源相对地址上创建新的文件。
  在 Web 应用中,用户还可以通过ServletContextResource 以相对于Web 应用根目录的方式访问文件资源,如下所示:

代码清单 3-15 resource.jsp                     

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<jsp:directive.page import="org.springframework.web.context.support.ServletContextResource"/>
<jsp:directive.page import="org.springframework.core.io.Resource"/>
<jsp:directive.page import="org.springframework.web.util.WebUtils"/>
<%
//①注意文件资源地址以相对于Web应用根路径的方式表示
Resource res3 = new ServletContextResource(application,"/WEB-INF/classes/conf/file1.txt");
out.print(res3.getFilename()+"<br/>");
out.print(WebUtils.getTempDir(application).getAbsolutePath());
%>

  对于位于远程服务器(Web 服务器或FTP 服务器)的文件资源,用户可以方便地通过UrlResource 进行访问。
资源加载时默认采用系统编码读取资源内容,如果资源文件采用特殊的编码格式,那么可以通过EncodedResource 对资源进行编码,以保证资源内容操作的正确性:

package com.baobaotao.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;
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);
    }
}

 

Spring的Resource 接口及其实现类

标签:

原文地址:http://www.cnblogs.com/zhangtongzct/p/4974324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!