Spring提供的Resource/ResourceLoader接口操作资源文件

Spring 设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力。该接口拥有对应不同资源类型的实现类,该接口的主要方法有:

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

Resource 在Spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,这些资源包括配置文件资源、国际化属性文件资源等。Resource 的具体实现类如下图:
图1

  • WritableResource:可写资源接口,是Spring 3.1版本新加的接口,有两个实现类,即FileSystemResource和PathResource,其中PathResource是Spring 4.0提供的实现类。
  • ByteArrayResource 二进制数组表示的资源,二进制数组资源可以在内存中通过程序构造。
  • ClassPathResource 类路径下的资源,资源相当于类路径的方式表示。
  • FileSystemResource 文件系统资源,资源文件系统路径的方式表示。例如:D:/conf/bean.xml
  • InputStreamResource 以输入流返回表示的资源。
  • ServletContextResource 为访问web上下文中的资源而设计的类,负责以相对于web应用根目录的路径加载资源,它支持以流和URL的方式访问,在war解包情况下,也可以通过File的方式访问,该类还可以直接从jar包中访问资源;
  • UrlResource Url封装了java.net.URL ,它使用户能够访问任何可以通URL表示的资源,如文件系统的资源、HTTP资源、FTP资源等
  • PathResource:Spring 4.0提供的读取资源文件的新类。Path封装了java.net.URL、java.nio.file.Path、文件系统资源,它使用户能够访问任何可以通过URL、Path、系统文件路径表示的资源,如文件系统的资源、HTTP资源、FTP资源等。

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


Spring提供了一个强大的加载资源的机制,不但能够通过”classpath:”、”file:”等资源地址前缀识别不同的资源类型,还支持Ant风格带通配符的资源地址。

资源地址表达式

Spring支持的资源类型的地址前缀:

地址前缀示例对应资源类型
classpath:classpath:com/baobaotao/beanfactory/bean.xml从类路径中加载资源,classpath:和classpath:/等价,都是相对与类的跟路径。资源文件可以在标准的文件系统中,也可以在jar或者zip的类包中
file:file:/conf/com/baobaotao/beanfactory/bean.xml使用URLResource从文件系统目录中装载资源,可采用绝对或相对路径。
http://http: //www.baobaotao/resource/bean.xml使用UrlResource从web服务器中装载资源
ftp://ftp: //www.baobaotao.com/resource/bean.xml使用UrlResource从FTP服务器中装载资源
没有前缀com/baobaotao/beanfatory/beans.xml根据ApplicationContext具体实现类采用对应的类型的Resource

注意事项:

“classpath: “和 “classpath*:”区别:

举个例子: 假设有多个Jar包或者文件系统类路径下拥有一个相同包名(com.smart)

  • classpath: 只会在第一个加载的com.smart包的类路径下查找
  • classpath*: 会扫描所有的这些JAR包及类路径下出下的com.smart类路径

使用场景:

应用于分模块打包。假设我们有一个应用,分为3个模块,一个模块对应一个配置文件,分别为module1.xml 、module2xml、module3.xml….等,都放在了com.smart的目录下,每个模块单独打成JAR包。

我们可以使用classpath*:com/smart/module*.xml 加载所有模块的配置文件。

如果使用classpath:com/smart/module*.xml只会加载一个模块的配置文件。


Ant风格资源地址支持3种匹配符:

?:匹配文件名中的一个字符
* :匹配文件名中任意一个字符
** :匹配多层路径

下面是几个Ant风格的资源路径示例:

classpath:com/t?xt.xml 

匹配com路径下com/text.xml ,com/tast.xml或者com/txst.xml;

file:D:/conf/*.xml 

匹配文件系统D:/conf目录下所有以xml为后缀的文件;

classpath:com/**/test.xml

匹配com路径下(当前目录及其子孙目录)的test.xml文件;

classpath:org/springframework/**/*.xml

匹配类路径org/springframework/下是有的以.xml为后缀的文件;


spring定义了一套资源加载的接口:
图2
ResourceLoader 接口仅有一个getResource(String location)的方法,可以根据一个资源地址加载文件资源,不过,资源地址仅支持带资源类型前缀的表达式,不支持Ant风格的资源路径表达式。

ResourcePatternResolver 扩展了ResourceLoader 接口,定义了一个新的接口方法:getResources(String locationPattern),该方法支持带资源类型前缀及Ant风格的资源路径的表达式。

PathMatchingResourceResolver 是Spring提供了标准实现类。

注意事项

使用Resource操作文件时,如果资源的配置文件在项目发布的时候会打包到JAR中,那么就不能使用Resource.getFile()方法,否则会抛出FileNotFoundException异常,但可以使用 Resource.getInputStream()读取。

错误的读取方式:

(new DefaultResourceLoader()).getResource("classpath:conf/sys.properties").getFile();

正确的读取方式:

(new DefaultResourceLoader()).getResource("classpath:conf/sys.properties").getInputStream();

建议尽量使用流的方式读取,避免环境不同造成问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值