上篇博客简单的回顾了一下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的配置信息放在任何地方了.
ResourceLoader仅有一个getResource(String location)方法,可以根据一个资源地址加载资源,ResourcePatternResolver扩展ResourceLoader
关于spring的资源访问方面的知识先简单讲这些,请继续关注以后的博客.....
因为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的资源访问方面的知识先简单讲这些,请继续关注以后的博客.....