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. JAVA栈帧

    简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据 ...

  2. git常用命令记录

    配置本地仓库 git config --global user.name.git config --global user.email 查看配置详情 git config -l 初始仓库 git in ...

  3. repo版本切换

    repo init -u https://android.googlesource.com/platform/manifest repo sync 之后 这样初始化之后,相当于下载了全部的分支, 本想 ...

  4. Angular Route导航

    我们用Angular cli创建带有路由的新项目 ng new router --routing Angular Routes API文档 Angular的文档中有详细的解释: 1)https://a ...

  5. 为什么各大厂商要抢先跟进H.265?

    继爱奇艺.乐视等视频厂商宣布支持 H.265 高清视频后,2014 年 4 月,搜狐视频宣布正式上线视频行业首个 H.265 高清大片专区,可在线观看 200 余部当下最火的超高清大片.国外 BBC ...

  6. 移动端网页meta设置和响应式

    苏宁易购WAP的meta分析 响应式 meta设置 媒体查询时读的width为viewport的宽度.viewport宽度为手机分辨率.比如note2 1280*720.需要重置为设备 640*360 ...

  7. php笔记一

    一.Login登陆验证步骤: 1.赋值,用$_POST将id和password传递给loginProcess.php登陆验证页面. 2.建立数据库连接 $conn=mysql_connect($hos ...

  8. javaSE_Java第一周总结:有难度题目集合

    第一周练习总结 说明:尽量采用多种做法解决 1.使用三种方法实现变量交换 public class Test1Change{ public static void main(String[] args ...

  9. javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...

  10. 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)

    前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...