Spring Resource接口进行资源访问

双目相机模型 近期想研究一下 双目相机 的内容,故先把 理论 弄清楚! 一、双目相机模型 针孔相机模型描述了 单个相机 的成像模型。然而,仅根据一个像素,我们是无法确定 这个空间点的具体位置的。这是因为,从相机光心到归一化平面连线上的所有点,都可以 投影至该像素上。只有当 P 的深度确定时(比如通过双目或 RGB-D 相机),我们才能确 切地知道它的空间位置。 测量像素距离(或深度)的方式有很多种,像人眼就可以根据左右眼看到的景物差异 (或称视差)来判断物体与我们的距离。双目相机的原理亦是如.. 阅读详情

前言

        什么是资源?我们已知Spring中有很多xml配置文件,同时还可能自建各种properties资源文件,还有可能进行网络交互,收发各种文件、二进制流等。粗略可分为:URL资源、File资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)。Spring把这些文件、二进制流统称为资源。程序对这些资源的访问,就叫做资源访问。

        J2SE中,有些处理资源文件的标准API,例如InputStream等文件IO和java.net.URL。但因为并非专门为Web服务设计,所以对于Spring服务,这些工具类显得比较底层。若直接使用这些方法,需要编写比较多的额外代码,例如前期文件存在判断、相对路径变绝对路径等。

        处理资源文件步骤都很类似(打开资源、读取资源、关闭资源),所以若抽象出一个统一的接口来对这些底层资源进行统一访问,用起来就十分方便。对不同的底层资源都实现同一个接口,重写方法时再实现不同的处理。 这个接口就是Spring提供的Resource接口。



一. Resource接口 

         Spring的Resource接口继承InputStreamSource。

public interface Resource extends InputStreamSource {
}


          InputStreamSource接口方法: 
● getInputStream:定位并打开资源,返回资源对应的输入流。每次调用都会返回新的输入流,调用者在使用完毕后必须关闭该资源。 

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

Resource接口其他的方法: 
● 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();
}

 

二. 具体实现

Spring内已经提供了很多内置Resource实现:

  • ByteArrayResource
  • InputStreamResource 
  • FileSystemResource 
  • UrlResource 
  • ClassPathResource
  • ServletContextResource
  • VfsResource 
  • 等等.......

1. UrlResource

        代表URL资源,用于简化URL资源访问,是对java.net.URL的包装。在java中,将不同来源的资源抽象成URL,通过注册不同的handler来处理不同来源的资源的读取逻辑。一般不同类型使用不同的前缀。

        isOpen永远返回false,表示可多次读取资源。 
        UrlResource应该提供标准的协议前缀,一般支持如下资源访问: 

  • http:通过标准的http协议访问web资源,如new UrlResource(“http://地址”); 
  • ftp:通过ftp协议访问资源,如new UrlResource(“ftp://地址”); 
  • file:通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”) 
UrlResource ur = new UrlResource("file:web.xml")

        但是UrlResource无法解决相对classpath路径或servletContext的处理方法,因此需要其他的Resource实现类。

 

2. ClassPathResource

        代表classpath路径的资源,将使用ClassLoader进行加载资源。主要优势是方便访问类加载路径下的资源,尤其是Web应用,因为它可以自动搜索位于WEB-INF/classes下的资源文件

        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("book.xml");
	
}

    当Spring获取资源时,路径字符串前缀是"classpath:",则系统将会自动创建ClassPathResource对象

 

3. 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());
}

    当Spring获取资源时,路径字符串前缀是"file:",则系统将会自动创建FileSystemResource对象


4. ServletContextResource

         访问Web Context下相对路径下的资源,入参的资源位置是相对于Web应用根路径的位置(工程文件夹下,WEB-INF所在的那级文件夹)。用于简化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。 

        使用ServletContextResource无需关心资源是否被解压缩出来,或者直接存放在JAR文件中,都可以通过Servlet容器访问。

        入参需要ServletContext和字符串类型

public class ResourceTest {
	ServletContextResource resource = new ServletContextResource(servletContext,"spring.xml");
}

5. InputStreamResource

        代表java.io.InputStream字节流,对于getInputStream操作将直接返回该字节流,因此只能读取一次该字节流,即isOpen永远返回true(其他Resource大都为false可以多次读取) 

        只有当没有合适的Resource实现时,才考虑使用InputStreamResource。一般考虑使用ByteArrayResource

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());
}

入参需要InputSteam类型

public class ResourceTest {	
	//需要inputStream作为入参
	InputStreamResource resource = new InputStreamResource(inputStream);
}

 

6. ByteArrayResource

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

        入参需要byte[] 字节数组类型

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) {  
            }  
        }  
}

        ByteArrayResource因为入参可以是byte[]类型,所以用途比较广泛,可以把从网络或者本地资源都转换为byte[]类型,然后用ByteArrayResource转化为资源。

ABAP 平台注册 OAuth 2.0 Client 的完整实践指南(覆盖 Authorization Code、SAML Bearer 与 PKCE) 本文详述了在ABAP平台上注册入站OAuth 2.0 Client的关键技术和操作要点。文章面向SAP技术人员,系统梳理了前置条件(TLS/SSL、技术用户、授权对象)、配置路径(SOAUTH2事务)、授权类型差异(授权码、SAML Bearer、PKCE)等重要内容。特别强调入站与出站配置的区别,并提供了保密客户端和公有客户端的配置指引。文中所有事务码和参数均参考SAP官方文档,包含多个实用案例和权限配置建议,为ABAP系统作为OAuth 2.0授权服务器的实施提供全面指导。 阅读详情

相关推荐

版图学习汇总十一(DRC、LVS注意事项)

esd。

weixin_56071389的博客 2262

java url getresource_Java Resource.getURL方法代码示例

import org.springframework.core.io.Resource; //导入方法依赖的package包/类/*** Perform Spring-based scanning for entity classes.* @see #setPackagesToScan*/private SpringPersistenceUnitInfo buildDefaultPersisten...

weixin_28813401的博客 877

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

本文从初学者的角度分享的关于Matlab simscape 的基础内容,简单分享了Simscape搭建模型,创建子系统,修改定义参数等内容,为将来深入学习和使用simscape做铺垫。

万金油笑匠的博客 6514

request.getURL()跟request.getURI()以及通过request获得路径相关大全

request.getURL()和request.getURI()   如果我的请求是:http://localhost:8080/ServletTest/servlet/Hello   request.getRequestURI() 返回值类似:/ServletTest/servlet/Hello   request.getRequestURL() 返回值类似:http:/

PR 2万+

BGE-M3 文本情感分类实战:预训练模型微调,导出ONNX并测试

本文介绍了如何基于BGE-M3开源模型实现一个简单的二分类情感分析任务,展示了NLP中经典的“预训练 + 微调”范式。首先,加载预训练模型和分词器,并构建分类头整合到模型中。接着,进行数据预处理并构建DataLoader。然后,定义优化器、损失函数和训练循环,进行模型微调。微调过程中,可以选择基于[CLS] token的单特征提取或基于池化策略的多特征融合。最后,通过验证与推理评估模型性能,并导出ONNX模型以适应生产环境。BGE-M3在语义表征任务中表现优异,适合作为文本分类、语义搜索等下游任务的基础模型

大鹏的专栏 1401

VulnHub系列之BadStore_123渗透测试

BADSTORE: 1.2.3 早期网商系统漏洞鉴赏(2004)

Flynn的博客 1628

url和uri区别

这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java Bean中定义一些字段,用来表示资源的位置,比如:imgUrl,logoUri等等。但是,每次定义的时候,心里都很纠结,是该用imgUrl还是imgUri呢?同样的,另外一个问题:String HttpServletRequest.getRequestURI();和StringBuffer HttpServletRequest.getRequestURL();返回的内容有何不同?为什么会如此?带着这些问题到网上去搜了下,没发现让自己看了明白的

xmh_sxh_1314的博客 775

fins协议握手信号服务器响应,欧姆龙FinsTCP与FinsUDP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析附含报文模拟器等...

前言 – Fins欧姆龙这个协议网上极少有相关的模拟器、Tcp的这一块倒是有但是Udp的基本都是不可用1、 Fins协议结构也很简单 协议分为两种 一种tcp一种udp2、 Tcp比Udp的报文会多一层tcp的head头部3、 Udp回应报文在Wireshark中是解析不到(因为他按照UDP的格式去解那指定是解不到)好长时间没有更新过博客了、也比较懒= = 。一、Read(TCP)发包那么这个就很...

weixin_32491317的博客 4435

Springboot获取jar包中resources资源目录下的文件

Springboot获取jar包中resources资源目录下的文件

weixin_42585386的博客 9467

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 389

2026年软考高级网络规划设计师第三版备考笔记

删除了所有已退出主流应用、行业淘汰的技术内容,如 HDLC、xDSL、WiMAX、HSRP/GLBP 等,让教材内容更聚焦当下一线网络工程实际场景,剔除无效考点。

鹿鸣天涯 1206

Spring源码学习(一)

Spring源码学习

叶小东的博客 515

基于Simulink的智能车辆电子稳定控制(ESC)仿真

本文完成了基于 Simulink 的智能车辆电子稳定控制(ESC),实现了:✅ 构建含轮胎非线性的车辆动力学模型✅ 设计滑模横摆稳定性控制器✅ 实现四轮制动力分配逻辑✅ 验证在双移线低附着场景下的卓越稳定性✅ 为主动安全控制系统开发提供完整范式。

xiaoheshang_123的博客 78

【Spring】Resource接口访问资源

Spring提供了Resource接口,为应用提供了更强的底层资源访问能力,该接口拥有对应不同资源类型的实现类。 资源访问接口 主要方法 boolean exists() 资源是否存在 boolean isOpen() 资源是否打开 URL getURL() throws IOException 如果底层资源可以表示成URL,则该方法放回对应的URL对象 File getFile() thro...

ngc_1277 241

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Resource 接口是 Spring 资源访问的接口,具体的资源访问由该接口的实现类完成

Spring 框架提供了很好的扩展性,除了可以与各种第三方框架良好整合外,其 IoC 容器也允许开发者进行扩展,这种扩展甚至无须实现 BeanFactory 或 ApplicationContext 接口, 而是允许通过两个后处理器对 IoC 容器进行扩展

HEMM000的专栏 1366

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring学习(九)资源访问接口Resource

JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,比如缺少从类路径或者从web容器的上下文中获取资源的操作类。因此,Spring设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。 那么先来了解一下resource资源中的主要方法: 1.    boolean exists():判断资源是否存在 2.    b

wangxin1248的博客 1484

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring3外部资源访问之Resource接口

概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都...

chifancui9836的博客 183

spring-第十四篇之资源访问Resource接口

1、Resource接口提供的主要方法 1》getInputStream():定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流。调用者必须负责关闭输入流。 2》isOpen():返回资源文件是否打开,如果资源文件不能多次读取,每次读取结束时应该显式关闭,以防止资源泄漏。 3》exists():返回Resource所指向的资源是否存在。 ...

weixin_30409849的博客 106

【小家Spring】资源访问利器---Spring提供的Resource接口以及它的常用子类源码分析

前言 资源是一个抽象的概念,什么是资源?我们已知Spring中有很多xml配置文件,同时还可能自建各种properties资源文件,还有可能进行网络交互,收发各种文件、二进制流等。 资源粗略的可以分为(这里以Spring的分类为例): URL资源 File资源 ClassPath相关资源 服务器相关资源(JBoss AS 5.x上的VFS资源) JDK操纵底层资源基本就是java.net.UR...

架构师:通透,才能写出好代码! 1704

Spring的资源访问接口---Resource

JDK提供的访问资源的类(File等)不能很好满足各种某些资源的访问需求。比如缺少从类路径和Web容器的上下文中获取资源的资源操作类。Spring的Resource接口提供了更好用的资源访问能力。Spring使用Resource访问各种资源文件,配置文件资源,国际化属性资源等。 Resource.java package org.springframework.core.io; impo...

叭嘣的博客 1794

arr访问绝对地址_spring-boot: 相对路径:classpath: Resource 接口: 访问资源

java.net.URLclasspath:类路径:就是应用的源码路径:tomcat/webapps/应用/源码文件夹ServletContext遗憾的是,Java的标准java.net.URL类和各种URL前缀的标准处理程序不足以完全访问低级资源。 例如,没有标准化的URL实现可用于访问需要从类路径或相对于ServletContext获取的资源。 虽然可以为专用URL前缀注册新的处理程序(类似于...

weixin_39611754的博客 186

(十)spring资源访问Resource接口

如果想要进行磁盘文件的读取操作,首先想到的一定是java.io包中提供的一系列类,还可以继续深入的想到ImputStream,OutputStream,Scanner,PrintStream,BufferedReader等核心的处理操作类.但是现在有如下几个问题, 这几个类的互相操作难度太高,很多人实际上对于IO的领悟并不是很彻底, IO支持的读取有限且复杂: ...

007的博客 326

Spring学习----------资源访问接口Resource

JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,比如缺少从类路径或者从web容器的上下文中获取资源的操作类。因此,Spring设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。那么先来了解一下resource资源中的主...

京GHK008 468

Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用

ResourceResource接口是 Spring 框架中用于加载和访问资源的关键组件。它提供了一种统一的方式来处理不同类型的资源,包括类路径下的资源和文件系统中的资源。通过使用Resource接口,您可以更灵活地管理应用程序中的资源,无论这些资源实际上存储在哪里。希望这篇文章能够帮助您更好地理解和使用 Spring 框架中的Resource接口。通过合理利用Resource接口,您可以更好地组织和管理应用程序中的资源,使其更具可维护性和扩展性。后记 👉👉💕💕美好的一天,到此结束,下次继续努力!!

weixin_65175398的博客 1557

攻城狮在路上(贰) Spring(三)--- Spring 资源访问利器Resource接口

Spring为了更好的满足各种底层资源的访问需求。设计了一个Resource接口,提供了更强的访问底层资源的能力。Spring框架使用Resource装载各种资源,包括配置文件资源、国际化属性文件资源等。一、Resource接口的主要方法有:  boolean exists():资源是否存在。  boolean isOpen():资源是否打开。  URL getURL():如果底层资源可...

116

spring学习笔记(2)文件资源访问接口Resource

spring 资源抽象接口下的几个常用实现类 实现类 说明 ClassPathResource 类路径下的资源,资源以相对类路径的方式表示 FileSystemResource 文件系统资源,资源以文件系统路径的的方式表示,如/home/root/test.txt ServletContextResource 为访问web上下文中的资源而设计的类,负责以相对于web应用

总结沉淀 1806
上一篇: @Qualifier注解知多少?-- Spring注入Bean时增加约束
下一篇: Spring使用ResourceLoader接口获取资源
郭Albert
博客等级 码龄14年 110粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭Albert

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值