标签:
JDK 所提供的访问资源的类(如java.net.URL、File 等)并不能很好地满足各种底层资源的访问需求,比如缺少从类路径或者Web 容器的上下文中获取资源的操作类。有鉴于此,Spring 设计了一个Resource 接口,它为应用提供了更强的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。先来了解一下Resource 接口的主要方法:
Resource 在Spring 框架中起着不可或缺的作用,Spring 框架使用Resource 装载各种资源,这些资源包括配置文件资源、国际化属性文件资源等。下面我们来了解一下Resource的具体实现类,如图3-5 所示:
提示:Spring 的Resource 接口及其实现类可以在脱离Spring 框架的情况下使用,它比通过JDK 访问资源的API 更好用,更强大。
假设有一个文件位于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); } }
标签:
原文地址:http://www.cnblogs.com/zhangtongzct/p/4974324.html