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

转载于:https://my.oschina.net/easyean/blog/535150

halcon第一讲:基本操作 本文通过Blob分析提取出图片中的硬币,来熟悉halcon的基本操作。 1、读取图像,halcon读取图像有三种方式:1)、文件-&gt;读取图像;2)、通过助手;3)、代码 *打开窗口 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) *读取图像 read_image (Image,'1.png') 读取的图像如下: 2... 阅读详情

相关推荐

Obsidian从零搭建:可验证、可回溯、可演进的知识库工具链

个人知识库不是开箱即用的软件,而是基于Markdown内核构建的可演进系统。其核心原理在于分离‘稳定内核’与‘可插拔扩展’:Obsidian原生支持双链、嵌入、Frontmatter等基础能力,构成不可降级的知识骨架;而Dataview、Templater等插件则作为可验证、可回溯的增强层,需通过三问验证(解决痛点?有原生替代?失效可降级?)方可引入。这种设计赋予知识库技术价值——抗版本升级、跨平台兼容、离线可用,并支撑技术文档管理、项目复盘、读书笔记等真实场景。当面对computer use插件不可用或h

weixin_30660027的博客 680

【Spring6】资源操作:Resources

Java Sring6

Chovy_pyc的博客 1377

博途WinCC多语言项目配置指南

在博途(TIA Portal)中为WinCC项目配置多语言功能,需通过系统化步骤实现界面文本的动态切换。

dhaimo的博客 2468

【Spring4揭秘 基础3】统一抽象资源---Resource

JDK操纵底层资源基本就是 java.net.URL 、java.io.File 、java.util.Properties这些。 没有一个统一的接口可以使用,正因为这样,Spring开发者抽象了一个Resource接口,它代表所有的应用程序外部资源,提供了更强大的访问外部资源的能力。一. Resource简介Resouce接口并不是一个根接口,它继承了一个简单的父接口 InputStreamSou

要啥自行车 2802

ROS牛耕法全覆盖规划:从算法原理到清洁机器人实战解析

本文深入解析ROS牛耕法全覆盖规划算法在清洁机器人中的应用,从算法原理到实战优化技巧全面覆盖。详细介绍了地图预处理、区域分解和路径优化等关键步骤,并分享实际案例中的解决方案,帮助开发者提升机器人清扫效率和覆盖率。

weixin_27013291的博客 390

从AI画稿到3D虚拟时装:Illustrator与Substance 3D的服装设计工作流

本文旨在解决传统服装与纺织品设计师在产品开发流程中,面临的“2D印花图案无法直观预见3D上身效果”、“物理打样成本高昂且周期漫长”的核心痛点。我们将介绍一套纯数字化的3D可视化工作流,核心是利用 Adobe Illustrator 进行矢量印花图案创作,通过 Adobe Substance 3D Sampler 将其转化为逼真的PBR(基于物理渲染)布料材质,并最终在 Adobe Substance 3D Stager 中,将该材质应用于3D服装模型,渲染出照片级的虚拟样衣。本指南将帮助设计师以极低的成本和

Kingsdesigner的博客 1393

Spring的资源管理(Resource)

Spring的资源管理(Resource)

xharvard的专栏 635

手把手教你学Simulink--单相逆变器模糊逻辑控制策略仿真

本文介绍了在Simulink中设计单相逆变器模糊逻辑控制策略的完整流程。主要包括:1)构建单相逆变器模型;2)使用FuzzyLogicToolbox设计模糊控制器,定义输入输出变量和模糊规则;3)将控制器集成到Simulink模型;4)添加干扰源和示波器;5)配置仿真参数并分析结果。该方法利用模糊控制处理非线性系统的优势,可实现输出电压的精确跟踪,具有良好的鲁棒性。文中提供了详细的步骤说明和示例代码,强调准确设计隶属函数和规则库对控制性能的关键作用。该仿真设计为电力电子控制系统的开发提供了有效支持。

MHD0815的博客 199

1、spring之Resource加载

一、对资源的抽象 Spring把其资源做了一个抽象,底层使用统一的资源访问接口来访问Spring的所有资源。也就是说,不管什么格式的文件,也不管文件在哪里,到Spring 底层,都只有一个访问接口,Resource。 1.1 类结构图 1.2 类和接口分析 1、可以看到有四个比较重要的接口 InputStreamSource、Resource、WritableResource、ContextRe...

liu20111590的专栏 4653

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1762

80、编程学习资源与x86知识全解析

本文详细介绍了编程学习中多个领域的优秀书籍和博客资源,涵盖逆向工程、C/C++、x86/x86-64架构、ARM、汇编语言、Java、UNIX、密码学等多个方向。同时,深入解析了x86架构的核心知识,包括术语、通用寄存器、FPU寄存器、SIMD寄存器、调试寄存器以及常用指令的使用方法和操作步骤。通过本文,读者可以系统地掌握底层编程知识,并应用于逆向工程、系统开发和性能优化等领域。

tree的博客 218

Spring 核心技术 - Resources 资源

Spring 学习指南大全 Spring 核心技术 官方文档版本 Version 5.2.22.RELEASE 文章目录Resources 资源简介Resource(资源)接口内置 Resource(资源) 实现UrlResourceClassPathResourceFileSystemResourceServletContextResourceInputStreamResourceByteArrayResourceResourceLoader (资源加载器)ResourceLoaderAware 接口

铠の魂博客 333

核心组件大换血:Backbone与Neck魔改篇:YOLO26结合StarNet结构:2026星状网络在YOLO生态的即插即用实战

本文将介绍如何将StarNet作为Backbone替换YOLO26原生架构,以提升边缘设备上的目标检测性能。文章首先分析了YOLO26在特定场景下的精度瓶颈,指出其通用Backbone设计存在不足。随后深入解析StarNet的核心创新——星操作(Star Operation),这一低维计算却能获得高维特征表达的数学魔术,以及其极简的StarBlock模块设计。通过对比YOLO26原生架构的三大创新与痛点,作者提出两种替换策略:完整替换Backbone或局部替换+Neck联调。文中提供了StarNet核心代码

ZDQ58818的博客 287

13. spring-容器: Resource接口详解

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

elegent Developer's 的博客 1724

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring --Resource接口详解

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

starchao 438

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

spring boot配置访问外部资源

spring boot配置访问外部资源 第一种实现WebMvcConfigurer 接口 package com.lcmoled.ap.apFront.config; import com.lcmoled.ap.common.Result.imgUtile; import org.springframework.context.annotation.Configuration; import o...

qq_39015306的博客 438

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

spring外部资源抽象处理

Spring-Resourcespring中外部资源抽象resource抽象接口主要实现类ResourceLoader spring中外部资源抽象 resource 是spring对外部资源的抽象 resource抽象接口 public interface Resource extends InputStreamSource { boolean exists(); default boolean isReadable() { return exists(); } boole

yiyizishuo的博客 164

spring Resource

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

qq_36284689的博客 140

Spring中Resource接口详解

原本地址:https://www.cnblogs.com/yw0219/p/7255522.html 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、...

Danny的博客 8974

8.Spring之Resource(1)

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

持之以恒! 1296

Spring 学习笔记 Resource 资源

Spring Resources 概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理 URL 资源、File 资源、ClassPath相关资源等等。并且在 java 中 Java .net.URL 类和用于各种 URL 前缀的标准处理程序对于所有对底层资源的访问都不够充分。处理各种各样的资源需要使用到不同的接口,这就增加了系统的复杂性。 对此 Spring 提供了 Resour...

qq_16830879的博客 1672

Spring 一 Resources概述、对外部资源访问、UrlResource访问网络资源、ClassPathResource 访问类路径下资源等

在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理 URL 资源、File 资源、ClassPath相关资源等等。并且在 java 中 Java .net.URL 类和用于各种 URL 前缀的标准处理程序对于所有对底层资源的访问都不够充分。处理各种各样的资源需要使用到不同的接口,这就增加了系统的复杂性。对此 Spring 提供了 Resource 接口来统一这些底层资源一致的访问。Resource 接口是一个更强大的接口,用于抽象对底层资源的访问。

Guizy 962

Spring核心-Resource

fff

程序缘 371

spring之加载外部资源

spring之加载外部资源 ----------     有时,应用程序可能需要从不同的位置(例如:文件系统、classpath或者URL)读取外部资源(例如:文本文件、xml文件、属性文件或或者图像文件)。通常,为了从不同位置加载资源,需要和不同的API打交道。 Spring的资源加载器提供了一个统一的getResource()方法,使用这个方法可以通过资源路径获取外部资源。可以给路径...

fhd001的专栏 394

8.spring之Resource的基础知识

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

anjunshuang 215

通过Spring Resource接口获取资源

通过Spring Resource接口获取资源 https://www.iteye.com/blog/elim-2016305

暮霭层层楚天阔的博客 603
上一篇: Hibernate4之配置详解
下一篇: Struts2配置精要之struts.xml( global和default的配置)
chifancui9836
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值