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

来源:互联网 发布:java实现支付功能 编辑:程序博客网 时间:2024/04/27 15:04
上篇博客简单的回顾了一下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资源内容:ssssssssssssssssssssshello 司冬雪!!!@#$%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.xmlstandard-html-renderkit.xmlrss-example.xmlcom.xmlilucky.xmlresource.xmlspring.xml*/
在上面的代码中我们看到资源路径是"classpath*,所以PathMatchingResourcePatternResolver将扫描所有类路径下及JAR包中对应com类包下的

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

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


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



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果8plus掉了怎么办 淘宝账户被限制使用怎么办 飞利浦电脑显示器黑屏怎么办打开 微信忘记密码手机号停用怎么办 淘宝账号登录密码忘记了怎么办 淘宝支付密码输错了怎么办 淘宝支付密码忘记了怎么办 淘宝货品上架后显示过期怎么办 被淘宝客监控了怎么办 助学贷款支付宝账号忘记怎么办 离婚支付宝的钱怎么办 扫码加载不出来怎么办 淘宝店铺被投诉售假怎么办 刚开的新店没人怎么办 淘宝访客量突然下降怎么办 支付宝账号封了怎么办 苹果x手机黑屏打不开怎么办 淘宝支付密码被锁定怎么办 淘宝支付密码锁定了怎么办 很抱歉手机淘宝停止运行怎么办 苹果手机桌面淘宝图标不见了怎么办 提示网页上有错误怎么办 淘宝定制家具违约两个月怎么办 同行在买家评价下面评论怎么办 淘宝知识产权侵权被投诉了怎么办 闲鱼买家说是假货退货怎么办 日验证失败次数上限怎么办 淘宝卖家发货不全怎么办 子账号登录不上怎么办 淘宝宝贝曝光量少怎么办 淘宝买东西退款卖家拒绝怎么办 华为手机淘宝不能收藏宝贝怎么办 包裹发出不想要了怎么办 淘宝改登录密码忘记了怎么办 三星s8应用闪退怎么办 淘宝购物商家不发货怎么办 淘宝商家迟迟不发货怎么办 买家地址写错了怎么办 买家写错快递地址怎么办 淘宝退款选择服务类型出不来怎么办 网购东西发错了怎么办