1. Resource简单介绍

注:所有操作基于配置好的Spring开发环境中。

在Spring中,最为核心的部分就是applicationContext.xml文件,而此配置文件中字符串的功能发挥到了极致。

在Java里面提供了最为原始的IO处理操作支持,但是传统的java.io包中只提供了inputStream与outputStream,虽然是最为常用的输入输出的处理类,但是用其进行一些复杂的资源读取非常麻烦。所以使用PrintStream,Scanner来改善这样的操作处理。但是即便这样,对网络资源,classpath以及一些内部文件的读取也不是很方便。

为此,Spring中设计了一组资源读取的处理接口Resource(org.springframework.core.io.InputStreamSource子接口)。Rresouce中有如下常用处理方法:

public loobean exists(),判断资源是否存在;

public long lastModified(),取得最后一次修改的日期;

public InputStream getInputStream,取得输入流对象。

可以发现Resource对资源的读取很方便,但是要使用Resource还需要依靠不同的子类实现:内存读取(ByteArrayResouce),classpath读取(ClassPathResource),文件读取(FileSystemResource),url读取(UrlResource),web上下文读取(ServletContextResource)。

读取不同的资源

下面对不同的资源类型进行读取:

1,内存操作流的读取:

package cn..io;

import java.io.IOException;

import java.util.Scanner;

import org.springframework.core.io.ByteArrayResource;

import org.springframework.core.io.Resource;

public
class Resource1 {

public
static
void main(String[] args) throws IOException {

String info="hello word!!";

Resource resource=new ByteArrayResource(info.getBytes());

if(resource.exists()){

Scanner scan=new Scanner(resource.getInputStream());

scan.useDelimiter(" ");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

}

2,文件的
读取:

package cn..io;

import java.io.File;

import java.io.IOException;

import java.util.Scanner;

import
org.springframework.core.io.ByteArrayResource;

import org.springframework.core.io.FileSystemResource;

import org.springframework.core.io.Resource;

public
class Resource2 {

public
static
void main(String[] args) throws IOException {

String filePath= "C:" + File.separator + "Users" + File.separator + "Administrator" + File.separator

+ "Desktop"+File.separator+"pom.xml";

File file=new File(filePath);

Resource resource=new FileSystemResource(file);

if(resource.exists()){

Scanner scan=new Scanner(resource.getInputStream());

scan.useDelimiter(" ");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

,基于classpath的数据读取:

package cn..io;

import java.io.IOException;

import java.util.Scanner;

import org.springframework.core.io.ClassPathResource;

import org.springframework.core.io.Resource;

public
class Resource2 {

public
static
void main(String[] args) throws IOException {

Resource resource=new ClassPathResource("applicationContext.xml");

if(resource.exists()){

Scanner scan=new Scanner(resource.getInputStream());

scan.useDelimiter(" ");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

}

发现我们只是改变了一下子类,就可以对不同的资源进行读取,这让程序的开发变得简单和标准化了。

二,ResourceLoalder接口:

从上面的例子可以看到,要对不同的资源进行读取,需要实现Resource不同的子类,但是在Spring中我们要避免new的出现,因此,为了简化Resource读取资源以及操作不同子类实现不同需求,Spring中提供了ResourceLoader接口。

这个接口定义如下:

public
interface
ResourceLoader {

public Resource getResource(String location);

public ClassLoader getClassLoader();

}

可以使用DefaultResourceLoader子类对其进行实例化。在getResource()方法里可以接收一个表示资源路径的字符串数据,这个字符串格式有如下几种:

读取文件系统资源:file:路径;

读取网络资源:http://路径;

classpath读取:classpath:路径;

范例:1,读取文件资源

package cn..io;

import java.io.File;

import java.io.IOException;

import java.util.Scanner;

import org.springframework.core.io.DefaultResourceLoader;

import org.springframework.core.io.Resource;

import org.springframework.core.io.ResourceLoader;

public
class Resource4 {

public
static
void main(String[] args) throws IOException {

String filePath= "C:" + File.separator + "Users" + File.separator + "Administrator" + File.separator

+ "Desktop"+File.separator+"pom.xml";

File file=new File(filePath);

ResourceLoader loader=new DefaultResourceLoader();

Resource resource=loader.getResource("file:"+filePath);

if(resource.exists()){

Scanner scan=new Scanner(resource.getInputStream());

scan.useDelimiter(" ");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

,读取网络资源:

package cn..io;

import
java.io.File;

import java.io.IOException;

import java.util.Scanner;

import org.springframework.core.io.DefaultResourceLoader;

import org.springframework.core.io.Resource;

import org.springframework.core.io.ResourceLoader;

public
class Resource4 {

public
static
void main(String[] args) throws IOException {

ResourceLoader loader=new DefaultResourceLoader();

Resource resource=loader.getResource("http://www.springframework.org/schema/task/spring-task-4.1.xsd");

if(resource.exists()){

Scanner scan=new Scanner(resource.getInputStream());

scan.useDelimiter(" ");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

}

3,读取classp资源:

package cn..io;

import
java.io.File;

import java.io.IOException;

import java.util.Scanner;

import org.springframework.core.io.DefaultResourceLoader;

import org.springframework.core.io.Resource;

import org.springframework.core.io.ResourceLoader;

public
class Resource4 {

public
static
void main(String[] args) throws IOException {

ResourceLoader loader=new DefaultResourceLoader();

Resource resource=loader.getResource("classpath:applicationContext.xml");

if(resource.exists()){

Scanner scan=new Scanner(resource.getInputStream());

scan.useDelimiter(" ");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

}

这是可以发现我们只需要以字符串的形式配置不同的路径就能对不同的资源进行读取了。

三,Resource资源的注入:

之前都是直接在程序中配置完成的,但是这样做很明显不可能在实际开发中应用,最好的方式是以字符串的方式通过配置文件实现。现在我们就将所有的路径以字符串的形式在applicationContext文件中进行配置实现不同资源的读取。

1,设置一个专门负责资源处理的程序类:

package cn..util;

import java.io.IOException;

import java.util.Scanner;

import org.springframework.core.io.Resource;

public
class ResourceUtil {

private Resource src;

public
void setSrc(Resource src) {

this.src = src;

}

public
void print() throws IOException {

if (this.src.exists()) {

Scanner scan = new Scanner(this.src.getInputStream());

scan.useDelimiter("\n");

while (scan.hasNext()) {

System.out.println(scan.nextLine());

}

scan.close();

}

}

}

2,在applicationContext.xml文件里对资源进行注入控制:

读取classpath资源:

<bean
id="resourceUtil"
class="cn.wnh.util.ResourceUtil">

<property
name="src"
value="classpath:applicationContext.xml"
/>

</bean>

读取网络资源:

<bean
id="resourceUtil"
class="cn.wnh.util.ResourceUtil">

<property
name="src"

value="http://www.springframework.org/schema/task/spring-task-4.1.xsd"
/>

</bean>

编写一个测试类

public
class TestMessage {

public
static
void main(String[] args) throws IOException {

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

ResourceUtil ru=ctx.getBean("resourceUtil",ResourceUtil.class);

ru.print();

}

}

可以发现,程序里不再需要ResourceLoader了,这个类之间被Spring隐藏起来了。

4,实现多个资源的注入:

public
class ResourceUtil {

private Resource src[];

public
void setSrc(Resource src[]){

this.src=src;

}

public
void print() throws IOException{

for(int
x=0;x<this.src.length;x++){

if(this.src[x].exists()){

Scanner scan=new Scanner(this.src[x].getInputStream());

scan.useDelimiter("\n");

while(scan.hasNext()){

System.out.println(scan.nextLine());

}

scan.close();

}

}

}

}

<bean
id="resourceUtil"
class="cn.wnh.util.ResourceUtil">

<property
name="src">

<array>

<value>http://www.springframework.org/schema/task/spring-task-4.1.xsd

</value>

<value>classpath:applicationContext.xml</value>

</array>

</property>

</bean>

直接执行测试类进行测试,这是可以看到两个文件里的内容都读出来了。

4,Resource通配符:

在Resource处理资源的时候考虑到一些复杂资源的定位问题,所以引入了最初Ant工具中提出的通配符的概念,所以支持有以下三种通配符的使用:

"?":匹配任意一位字符;

"*":匹配任意多个字符;

"**":匹配任意多级目录的字符串内容。

(1)分别观察下面不同的通配符操作:

<bean
id="resourceUtil"
class="cn.mldn.util.ResourceUtils">

<property
name="src">

<array>

<value>classpath:x/**/LICENSE*</value>

</array>

</property>

</bean>

<bean
id="resourceUtil"
class="cn.mldn.util.ResourceUtils">

<property
name="src">

<array>

<value>classpath:**/LICENSE*</value>

</array>

</property>

</bean>

在定义资源路径的时候可以不受到目录的限制或细小名称的差别的限制。在开发中,最为常见的就是对"*.properties"文件的读取。

Spring中对资源的读取支持的更多相关文章

  1. Spring中ApplicationContext对事件的支持

    Spring中ApplicationContext对事件的支持   ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...

  2. Spring中的资源文件框架——Resource

    摘要 Spring4 以后,官方推荐我们使用Java Config来代替applicationContext.xml,声明将Bean交给容器管理. 在Spring Boot中,Java Config的 ...

  3. 简说Spring中的资源加载

    声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...

  4. Spring中的资源加载

    大家也都知道JDK的类加载器:BootStrap ClassLoader.ExtenSion ClassLoader.Application ClassLoader:也使用了双亲委派模型,主要是为了防 ...

  5. ClassPath资源的读取

    读取ClassPath的资源 在程序中经常有很多资源需要读取,常见的就是配置文件,Java中将文件当作一种资源来处理,可以使用Class或者ClassLoader来处理 一,使用Class类的getS ...

  6. Spring中的Resource

    Spring中的资源定义:Resource此接口的全名为:org.springframework.core.io.Resource比较常用的资源定义的实现类为:1.ClassPathResource ...

  7. Spring中资源的加载原来是这么一回事啊!

    1. 简介 在JDK中 java.net.URL 适用于加载资源的类,但是 URL 的实现类都是访问网络资源的,并没有可以从类路径或者相对路径获取文件及 ServletContext , 虽然可以通过 ...

  8. Spring中使用@Value读取porperties文件中的属性值方法总结及注意事项

    本文为博主原创,转载请注明出处. 此前曾总结过使用工具类读取properties文件中的属性值,有兴趣的可以看一下. 如何快速获取properties中的配置属性值:https://www.cnblo ...

  9. 8 -- 深入使用Spring -- 3...4 在ApplicationContext中使用资源

    8.3.4 在ApplicationContext中使用资源 不管以怎样的方式创建ApplicationContext实例,都需要为ApplicationContext指定配置文件,Spring允许使 ...

随机推荐

  1. NodeJS 入门第二天(EJS模板)

    一.复习 复习:Node.js开发服务器,数据.路由.本地关心的效果,交互: Node.js实际上是极客开发出的一个小玩具,不是银弹.有着别人不具备的怪异特点: 单线程.Non-blocking I/ ...

  2. 2017 UESTC Training for Data Structures

    http://acm.uestc.edu.cn/#/contest/show/155 对大二来说貌似这套题有点简单了,多是一眼题 发现漏了一题,然而是以前看别人讨论过的:). H:线段树+暴力.大概就 ...

  3. java.util.Properties工具类

    import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import ...

  4. 线程机制、CLR线程池以及应用程序域

    最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...

  5. sql还原(.sql文件还原)

    第一步: 把还原文件直接拖到SQL Server 2012(或者其他版本)里面,这里以MyDB.sql为例

  6. 一天搞定HTML----a标签02

    1.细说a标签 2.代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  7. Common.Logging源码解析一

    Common.Logging是Apache下的一个开源日志接口组件,主要用于切换不同的日志库,因为当前流行的日志库有很多向log4j.log4net(log4j的.net版本)等等,所以为了能灵活的切 ...

  8. 【WPF】用三角形网格构建三维图形

    虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image ...

  9. 【原创+史上最全】Nginx+ffmpeg实现流媒体直播点播系统

    #centos6.6安装搭建nginx+ffmpeg流媒体服务器 #此系统实现了视频文件的直播及缓存点播,并支持移动端播放(支持Apple和Android端) #系统需要自行安装,流媒体服务器配置完成 ...

  10. js中替换字符串(replace方法最简单的应用)

    replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp)也 ...