spring基础学习之IoC-资源访问(五)

上篇博客简单的回顾了一下Java的反射机制知识,本篇博客讲解一下spring的Resource接口.
因为JDK所提供的访问资源的类(如File,java.net.URL等),并不能很好的满足各种底层资源的访问需求,
于是spring设计了一个Resource接口,它提供了更强的访问底层资源的能力.该接口对应不同资源类型的实现类,
Resource接口的主要方法有:
boolean exists():资源是否存在.
boolean isOpen():资源是否打开.
URL getURL() throws IOException:如果底层资源可以表示成URL,该方法返回对应的URL对象.
File getFile() throws IOException:如果底层资源对应一个文件,该方法返回对应的File对象.
InputStream () throws IOException:返回资源对应的输入流.
Resource在spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,这些资源包括配置文件资源,
国际化属性文件资源等.下面简单了解一下Resource的具体实现类,Resource是一个接口,AbstractResource是一个抽象类,
实现了Resource接口,AbstractResource下有很多子类,分别是:
ByteArrayResource:二进制数组表示的资源.
ClassPathResource:类路径下的资源.
FileSystemResource:文件系统资源.
InputStreamResource:对应一个流资源.
ServletContextResource:访问web容器上下文的资源.
UrlResource:封装了java.net.URL,它使用户能够访问任何可以通过URL表示的资源,如文件的系统资源,HTTP资源和FTP资源等.
总之,有了如上的这些资源,我们就可以将spring的配置信息放在任何地方了.

下面以FileSystemResource,ClassPathResource和ServletContextResource为例,简单了解一下Resoruce的强大,直接看代码.

package com.ilucky.spring.resource;

import java.io.IOException;
import java.util.Date;

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

/**
 * @author IluckySi
 * @date 20140425
 */
public class FileSystemResourceTest {

	public static void main(String[] args) throws IOException {
		String filePath = "D:/abc.txt";
		Resource resource = new FileSystemResource(filePath);
		if(resource.exists()) {
			System.out.println("资源是否存在:"+resource.exists());
			System.out.println("资源是否打开:"+resource.isOpen());
			System.out.println("资源名称:"+resource.getFilename());
			System.out.println("资源最近修改时间:"+new Date(resource.lastModified()));
			System.out.println("资源URL:"+resource.getURL().toString());
			System.out.println("资源URI:"+resource.getURI().toString());
			System.out.println("资源描述:"+resource.getDescription());
			System.out.println("资源文件:"+resource.getFile());
			System.out.println("资源文件大小:"+resource.getFile().length());
			System.out.println("资源流:"+resource.getInputStream());
			//如上只列出了一些常用的方法.
		} else {
			System.out.println("资源是否存在:"+resource.exists());
		}
	}
}
/**
运行结果:
资源是否存在:true
资源是否打开:false
资源名称:abc.txt
资源最近修改时间:Fri Apr 25 16:51:13 CST 2014
资源URL:file:/D:/abc.txt
资源URI:file:/D:/abc.txt
资源描述:file [D:\abc.txt]
资源文件:D:\abc.txt
资源文件大小:49
资源流:java.io.FileInputStream@f84386
*/
package com.ilucky.spring.resource;

import java.io.IOException;
import java.util.Date;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * @author IluckySi
 * @date 20140425
 */
public class ClassPathResourceTest {
	public static void main(String[] args) throws IOException {
		Resource resource = new ClassPathResource("abc.txt");
		if(resource.exists()) {
			System.out.println("资源是否存在:"+resource.exists());
			System.out.println("资源是否打开:"+resource.isOpen());
			System.out.println("资源名称:"+resource.getFilename());
			System.out.println("资源最近修改时间:"+new Date(resource.lastModified()));
			System.out.println("资源URL:"+resource.getURL().toString());
			System.out.println("资源URI:"+resource.getURI().toString());
			System.out.println("资源描述:"+resource.getDescription());
			System.out.println("资源文件:"+resource.getFile());
			System.out.println("资源文件大小:"+resource.getFile().length());
			System.out.println("资源流:"+resource.getInputStream());
			//如上只列出了一些常用的方法.
		} else {
			System.out.println("资源是否存在:"+resource.exists());
		}
	}
}
/**
运行结果:
资源是否存在:true
资源是否打开:false
资源名称:abc.txt
资源最近修改时间:Fri Apr 25 17:11:05 CST 2014
资源URL:file:/D:/myproject/spring-resource/WebRoot/WEB-INF/classes/abc.txt
资源URI:file:/D:/myproject/spring-resource/WebRoot/WEB-INF/classes/abc.txt
资源描述:class path resource [abc.txt]
资源文件:D:\myproject\spring-resource\WebRoot\WEB-INF\classes\abc.txt
资源文件大小:71
资源流:java.io.BufferedInputStream@30e280
*/
<%@ page language="java" import="java.util.*" 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"/>
<%
	Resource resource = new ServletContextResource(application, "WEB-INF/abc.txt");
		if(resource.exists()) {
			out.println("资源是否存在:"+resource.exists() + "<br/>");
			out.println("资源是否打开:"+resource.isOpen()+ "<br/>");
			out.println("资源名称:"+resource.getFilename()+ "<br/>");
			out.println("资源最近修改时间:"+new Date(resource.lastModified())+ "<br/>");
			out.println("资源URL:"+resource.getURL().toString()+ "<br/>");
			out.println("资源URI:"+resource.getURI().toString()+ "<br/>");
			out.println("资源描述:"+resource.getDescription()+ "<br/>");
			out.println("资源文件:"+resource.getFile()+ "<br/>");
			out.println("资源文件大小:"+resource.getFile().length()+ "<br/>");
			out.println("资源流:"+resource.getInputStream()+ "<br/>");
		    out.println("资源路径:" + WebUtils.getTempDir(application).getAbsolutePath()+ "<br/>");
		} else {
		    out.println("资源是否存在:"+resource.exists());
		}
%>
<!-- 
资源是否存在:true
资源是否打开:false
资源名称:abc.txt
资源最近修改时间:Fri Apr 25 17:30:34 CST 2014
资源URL:jndi:/localhost/spring-resource/WEB-INF/abc.txt
资源URI:jndi:/localhost/spring-resource/WEB-INF/abc.txt
资源描述:ServletContext resource [/WEB-INF/abc.txt]
资源文件:D:\tomcat6\apache-tomcat-7.0.42\webapps\spring-resource\WEB-INF\abc.txt
资源文件大小:71
资源流:java.io.ByteArrayInputStream@2b6e48
资源路径:D:\tomcat6\apache-tomcat-7.0.42\work\Catalina\localhost\spring-resource
 -->
 
另外注意:系统加载资源时默认采用系统编码读取资源内容,如果资源文件采用特殊的编码格式,那么可以通过EncodedResource对资源进行

编码,以保证资源内容的正确性.直接看代码.

package com.ilucky.spring.resource;

import java.io.IOException;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.util.FileCopyUtils;

/**
 * @author IluckySi
 * @date 20140425
 */
public class EncodedResourceTest {
	public static void main(String[] args) throws IOException {
		Resource resource = new ClassPathResource("abc.txt");
		EncodedResource encRes = new EncodedResource(resource, "UTF-8");
		if(resource.exists()) {
			System.out.println("资源是否存在:"+resource.exists());
			String content = FileCopyUtils.copyToString(encRes.getReader());
			System.out.println("资源内容:" + content);
		} else {
			System.out.println("资源是否存在:"+resource.exists());
		}
	}
}
/**
运行结果:
资源是否存在:true
资源内容:sssssssssssssssssssss

hello 司冬雪!!!@#$%
ssssssssssssssssssssss
*/
spring基于上面的资源访问类,又定义了一套资源加载的接口ResourceLoader<--ResourcePatternResolver<--PathMatchingResourcePatternResolver,
ResourceLoader仅有一个getResource(String location)方法,可以根据一个资源地址加载资源,ResourcePatternResolver扩展ResourceLoader

接口,定义了一个新的接口方法getResources(String location),该方法支持带资源类型前缀及Ant风格的资源路径表达式.直接看代码.


package com.ilucky.spring.resource;

import java.io.IOException;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

/**
 * @author IluckySi
 * @date 20140425
 */
public class ResourcePatternResolverTest {

	public static void main(String[] args) throws IOException {
		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		Resource resources[] = resolver.getResources("classpath*:com/**/*.xml");
		for(Resource resource : resources) {
			System.out.println(resource.getFilename());
		}
	}
}
/**
运行结果:
jsf-ri-runtime.xml
standard-html-renderkit.xml
rss-example.xml
com.xml
ilucky.xml
resource.xml
spring.xml
*/
在上面的代码中我们看到资源路径是"classpath*,所以PathMatchingResourcePatternResolver将扫描所有类路径下及JAR包中对应com类包下的

路径,查询所有以xml为后缀的文件.

如下是此项目实例的结构:


Spring的Resource接口及其实现类可以在脱离Spring框架的情况先使用,它比通过JDK访问资源的API更好用,更强大.
关于spring的资源访问方面的知识先简单讲这些,请继续关注以后的博客.....



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值