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. 转义字符及URI编码

    URL中的转义字符 当URL的参数中出现诸如+,空格,/,?,%,#,&,=等特殊字符串符号时,因为上述字符有特殊含义,导致服务器端无法正确解析参数. 解决办法:将这些字符转化成服务器可以识别 ...

  2. 【转】jQuery Validate验证框架详解

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type=& ...

  3. 【 js 基础 】作用域和闭包

    一.编译过程 常见编译性语言,在程序代码执行之前会经历三个步骤,称为编译. 步骤一:分词或者词法分析 将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元. 例子:  var a = 2 ...

  4. ftp服务器可以连接但不能传输数据(proftpd)

    问题:在客户端连接FTP服务器(proftpd)时可以正常连接,但是无法正常传输数据 ftp> ls530 Please login with USER and PASSPassive mode ...

  5. js实现导航菜单栏随着屏幕的滚动进行滚动的效果

    $(window).scroll(function () { var $nav = $(".floatingMenu ul li"), length = $nav.length-1 ...

  6. java基础之位运算

    java中常见的位运算符:&(逻辑与) |(逻辑或) ~(取反) ^(逻辑异或) >>(右移) <<(左移) >>>(无符号右移) &(逻辑与 ...

  7. 导入java项目时出现红色叹号问题的解决

    问题:导入java项目时出现红色叹号(如下图所示) 原因:引入项目的某些jar包跟自己电脑上的位置不一样: 解决方案:步骤如下 (1)右键红色叹号所在项目————>build path————& ...

  8. 10分钟弄懂javascript数组

    建议阅读时间 : 10分钟 主要内容:javascript数组的基本概念.属性.方法 新建数组: var arr01 = ["a","b","c&qu ...

  9. HTMLCollection 对象详解,以及为什么循环获取的dom合集操作可能会出现下标不正确的情况?

    有时候循环dom合集,然后操作其中的某些dom之后,发现下标不正确了 比如我们要删除一个dom合集的时候: var selectDom = document.getElementsByClassNam ...

  10. java基础(四章)

    一.             switch结构(开关语句)的语法 switch(表达式 ){ ------- [dream1]类型为int.char case  常量1 :    ---------[ ...