`
一日一博
  • 浏览: 231065 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring3外部资源访问之Resource接口

阅读更多
概述
      在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。
      Spring提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力。

Resource接口
Spring的Resource接口代表底层外部资源,提供了对底层外部资源的一致性访问接口。

InputStreamSource接口解析:
● getInputStream:每次调用都将返回一个新鲜的资源对应的java.io.InputStream字节流,调用者在使用完毕后必须关闭该资源。

public interface InputStreamSource {
    InputStream getInputStream() throws IOException;
}

Resource接口继承InputStreamSource接口,并提供一些便利方法:
exists:返回当前Resource代表的底层资源是否存在
isReadable:返回当前Resource代表的底层资源是否可读
isOpen:返回当前Resource代表的底层资源是否已经打开,如果返回true,则只能被读取一次然后关闭以避免内存泄漏;常见的Resource实现一般返回false
getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IO异常
getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IO异常
getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IO异常
contentLength:返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。
lastModified:返回当前Resource代表的底层资源的最后修改时间。
createRelative:用于创建相对于当前Resource代表的底层资源的资源,比如当前Resource代表文件资源“d:/test/”则createRelative(“test.txt”)将返回表文件资源“d:/test/test.txt”Resource资源。
getFilename:返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://d:/test.txt”将返回“d:/test.txt”,而URL资源http://www.javass.cn将返回“”,因为只返回文件路径。
getDescription:返回当前Resource代表的底层资源的描述符,通常就是资源的全路径(实际文件名或实际URL地址)。

public interface Resource extends InputStreamSource {
       boolean exists();
       boolean isReadable();
       boolean isOpen();
       URL getURL() throws IOException;
       URI getURI() throws IOException;
       File getFile() throws IOException;
       long contentLength() throws IOException;
       long lastModified() throws IOException;
       Resource createRelative(String relativePath) throws IOException;
       String getFilename();
       String getDescription();
}


Resource接口提供了足够的抽象,足够满足我们日常使用。而且提供了很多内置Resource实现:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource 、ClassPathResource、ServletContextResource、VfsResource等

ByteArrayResource可多次读取数组资源,即isOpen()永远返回false

public static void Test_ByteArrayResource() {
	Resource resource = new ByteArrayResource("Hello!Spring!你好!".getBytes());
	if (resource.exists()) {
		dumpStream(resource);
	}
}
	
private static void dumpStream(Resource resource) {  
        InputStream is = null;  
        try {  
            //1.获取文件资源  
            is = resource.getInputStream();  
            //2.读取资源  
            byte[] descBytes = new byte[is.available()];  
            is.read(descBytes);  
            System.out.println(new String(descBytes));  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        finally {  
            try {  
                //3.关闭资源  
                is.close();  
            } catch (IOException e) {  
            }  
        }  
}


InputStreamResource代表java.io.InputStream字节流,对于getInputStream操作将直接返回该字节流,因此只能读取一次该字节流,即isOpen永远返回true
public static void Test_InputStreamResource() {
	ByteArrayInputStream bis = new ByteArrayInputStream(
			"Hello Spring!".getBytes());
	Resource resource = new InputStreamResource(bis);
	if (resource.exists()) {
		dumpStream(resource);
	}
	Assert.isTrue(resource.isOpen());
}


FileSystemResource代表java.io.File资源,对于getInputStream操作将返回底层文件的字节流,isOpen将永远返回false,从而表示可多次读取底层文件的字节流。
public static void Test_FileSystemResource() {
	File file = new File("d:/test.txt");
	Resource resource = new FileSystemResource(file);
	if (resource.exists()) {
		dumpStream(resource);
	}
	Assert.isTrue(!resource.isOpen());
}


ClassPathResource代表classpath路径的资源,将使用ClassLoader进行加载资源。classpath资源存在于类路径中的文件系统中或jar包里,且isOpen永远返回false,表示可多次读取资源。
ClassPathResource加载资源替代了Class类和ClassLoader类的getResource(String name)和getResourceAsStream(String name)两个加载类路径资源方法,提供一致的访问方式。
ClassPathResource提供了三个构造器
● public ClassPathResource(String path):使用默认的ClassLoader加载“path”类路径资源;
● public ClassPathResource(String path, ClassLoader classLoader):使用指定的ClassLoader加载“path”类路径资源;
● public ClassPathResource(String path, Class<?> clazz):使用指定的类加载“path”类路径资源,将加载相对于当前类的路径的资源;

public static void Test_ClassPathResource() throws IOException {
	Resource resource = new ClassPathResource("demo.properties");
	if (resource.exists()) {
		dumpStream(resource);
	}
	System.out.println("path:" + resource.getFile().getAbsolutePath());
	Assert.isTrue(!resource.isOpen());
}


UrlResource代表URL资源,用于简化URL资源访问。isOpen永远返回false,表示可多次读取资源。
UrlResource一般支持如下资源访问:
http:通过标准的http协议访问web资源,如new UrlResource(“http://地址”);
ftp:通过ftp协议访问资源,如new UrlResource(“ftp://地址”);
file:通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”)

ServletContextResource代表web应用资源,用于简化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。

VfsResource代表Jboss 虚拟文件系统资源。
Jboss VFS(Virtual File System)框架是一个文件系统资源访问的抽象层,它能一致的访问物理文件系统、jar资源、zip资源、war资源等,VFS能把这些资源一致的映射到一个目录上,访问它们就像访问物理文件资源一样,而其实这些资源不存在于物理文件系统。

具体用法可以参考博客:http://jinnianshilongnian.iteye.com/blog/1416320
分享到:
评论

相关推荐

    spring Resource管理详解

    Spring的Resource接口是访问资源的抽象,它提供了一种统一的资源访问方式,可以处理不同来源的资源,包括本地文件系统、类路径、URL等。Resource对象并不直接包含资源内容,而是提供了打开输入流、获取资源路径等...

    spring3.x 实战资源教程

    - **Resource接口**:Spring提供了一个统一的Resource接口来访问不同类型的资源。 - **ResourceLoader接口**:提供了获取Resource的方法,通常由ApplicationContext实现。 #### 3.2 内置Resource实现 - **ClassPath...

    跟我学spring3

    例如,Resource接口提供了统一的方法来读取和写入资源,使得处理各种资源变得简单。 书中的内容可能还包括了Spring的其他关键特性,如数据访问集成(如JDBC、Hibernate、MyBatis的使用)、Spring Boot的快速开发...

    spring 宝典

    - Spring提供了一套资源访问接口Resource,通过不同的实现类来支持各种类型的资源访问。 - **Resource实现类** - 包括网络资源、ClassPath资源、文件系统资源等多种类型。 - **资源加载** - 可以通过...

    spring资源文件

    5. **文件系统访问**:Spring的`Resource`接口提供了读取、写入和复制文件的能力,例如`readInputStream()`方法可以获取到一个输入流,用于读取文件内容。 6. **classpath资源**:Spring允许在类路径中查找资源,这...

    spring_FrameWork3.0

    - **Resource 接口:** Resource 是 Spring 提供的一个接口,用于表示应用程序中的资源,如文件、URL 等。 - **内置的 Resource 应用:** Spring 内置了几种 Resource 实现,如 FileSystemResource、ClassPath...

    Spring使用与实现总结.pdf

    - **Resource**是Spring中对外部资源的抽象,主要用于文件的抽象,尤其是XML文件,其中通常包含了Spring用户的Bean定义。 - **Resource**接口提供了一套比Java标准的URL访问机制更为灵活和强大的机制,支持多种资源...

    spring3的总结

    ### Spring3核心知识点详解 #### 一、Spring IoC与AOP **1.1 Spring IoC(Inversion of Control,控制反转)** - **概念理解**:IoC是一种设计原则,目的是为了降低代码之间的耦合度。在Spring框架中,IoC主要体现...

    《Spring 4 参考文档》高清电子版+书签

    在资源管理方面,Spring提供了抽象的Resource接口,使得应用能够以统一的方式访问各种资源,如文件系统、类路径和网络资源等。ResourceLoader接口是用于获取Resource对象的工具,ResourceLoaderAware接口则是使Bean...

    Spring攻略(第二版 中文高清版).part2

    2.10 加载外部资源 82 2.10.1 问题 82 2.10.2 解决方案 83 2.10.3 工作原理 83 2.11 创建Bean后处理器 85 2.11.1 问题 85 2.11.2 解决方案 85 2.11.3 工作原理 86 2.12 外部化Bean配置 89 2.12.1...

    spring-framework.zip

    3. **数据访问支持**:Spring提供了对JDBC、ORM(如Hibernate、MyBatis)和OXM(Object/Xml Mapping)的集成,简化了数据库操作。源码中,DataSource、JdbcTemplate、HibernateTemplate等类展示了Spring如何处理数据...

    Spring核心源码

    7. **资源管理**:Spring Core提供了对各种资源(如文件、URL、数据库连接等)的抽象和访问。`Resource`接口是资源的通用表示,`ResourceLoader`则用于加载资源。 8. **SpEL(Spring Expression Language)**:这是...

    spring-framework-reference3.2中文版

    资源部分讲解了如何使用Spring框架加载资源文件,包括Resource接口的介绍、内置Resource实现类、ResourceLoader以及如何将资源作为依赖项。资源模块支持从不同来源加载资源文件,如文件系统、类路径、URL等。 验证...

    spring-reference.pdf

    2. **资源访问**:Spring提供了Resource接口和相应的实现类,可以方便地访问各种类型的资源,如文件系统、类路径下的资源等。 九、Spring的配置与扩展 1. **PropertyPlaceholderConfigurer**:用于在配置文件中解析...

    Spring的经典面试题

    - **ClassPathResource**:用于访问类路径下的资源,通常用于访问位于jar包或class目录下的资源。 ### Spring框架中的设计模式 #### 21. Spring框架中使用的设计模式 - **工厂模式**:通过BeanFactory或...

    Spring攻略(第二版 中文高清版).part1

    2.10 加载外部资源 82 2.10.1 问题 82 2.10.2 解决方案 83 2.10.3 工作原理 83 2.11 创建Bean后处理器 85 2.11.1 问题 85 2.11.2 解决方案 85 2.11.3 工作原理 86 2.12 外部化Bean配置 89 2.12.1...

    spring-boot-reference-zh

    12. **国际化的支持(i18n)**:Spring Boot 提供了处理多语言的工具,如消息源(MessageSource)和资源包(Resource Bundle)。 13. **事件驱动和消息传递**:通过 Spring Integration 和 AMQP 支持消息队列(如 ...

Global site tag (gtag.js) - Google Analytics