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. .net后台获取DataTable数据,转换成json数组后传递到前台,通过jquery去操作json数据

    一,后台获取json数据 protected void Page_Load(object sender, EventArgs e){  DataTable dt = DBhepler.GetDataT ...

  2. Nginx教程(二) Nginx虚拟主机配置

    Nginx教程(二) Nginx虚拟主机配置 1 虚拟主机管理 1.1 Nginx管理虚拟主机 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主 ...

  3. Java读写Excel之POI超入门

    转自:http://rensanning.iteye.com/blog/1538591 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给J ...

  4. FPGA两种寄存器的使能

    在FPGA中,寄存器的使能设计一般有两种方式: 1.直接使用寄存器的使能端口. 2.使用一个数据选择器连接寄存器的D端口,通过数据选择器的sel端口做使能.如下图 这个方式与直接使用寄存器的CE端口有 ...

  5. linux tcp中time_wait

    http://www.cnblogs.com/my_life/articles/3460873.html http://blog.csdn.net/sunnydogzhou/article/detai ...

  6. 项目管理之 SVN 管理软件 CornerStone for Mac

    常用的项目管理有 Git 和 SVN.之前公司一直使用的是 Git,使用的是 SourceTree 客户端,据说 Git 比 SVN 要好,只能说各有特点吧,有兴趣的可以查看下两个的区别. 下面是学习 ...

  7. [转]tomcat部署

    转载博客原文地址:  http://www.cnblogs.com/xing901022/p/4463896.html 阅读目录 介绍 静态部署——在tomcat启动时部署 动态部署——在tomcat ...

  8. 每天一个JS 小demo之留言板。主要知识点:DOM方法的理解和运用

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  9. Bottle源码阅读笔记(二):路由

    前言 程序收到请求后,会根据URL来寻找相应的视图函数,随后由其生成页面发送回给客户端.其中,不同的URL对应着不同的视图函数,这就存在一个映射关系.而处理这个映射关系的功能就叫做路由.路由的实现分为 ...

  10. Webpack 代码分离

    Webpack 代码分离 代码分离是 webpack 中最引人注目的特性之一. 你可以把你的代码分离到不同的 bundle 中,然后你就可以去按需加载这些文件. 总的来说, webpack 分离可以分 ...