【Spring | 资源处理】

Resource

  • `Resource` 接口
    • 介绍
    • 核心方法
    • 常见接口
    • 优缺点
  • 内置`Resource`实现
    • UrlResource
    • ClassPathResource
    • FileSystemResource
    • PathResource
    • ServletContextResource
    • InputStreamResource
    • ByteArrayResource

Resource 接口


  不幸的是,Java的标准Java.net.URL类和各种URL前缀的标准处理程序对于所有对低级资源的访问来说都不够充分。例如,没有标准化的URL实现可以用于访问需要从类路径或相对于Servlet上下文获得的资源。虽然可以为专用URL前缀注册新的处理程序(类似于http:等前缀的现有处理程序),但这通常相当复杂,并且URL接口仍然缺乏一些所需的功能,例如检查所指向的资源是否存在的方法。

介绍


  Java的标准Java.net.URL 类和各种URL前缀的标准处理程序对于所有对低级资源的访问来说都不够充分,基于此,Spring 的 org.springframework.core.io.Resource 接口旨在成为一个更强大的接口,用于抽象对低级资源的访问,有关Resource接口的更多详细信息,参考Resource。
在这里插入图片描述

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

 正如Resource接口的定义所示,它扩展了InputStreamSource接口。以下列表显示InputStreamSource接口的定义:

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

核心方法


Resource 接口的最核心方法如下:

  • getInputStream():定位并打开资源,返回用于从资源中读取的InputStream。预计每次调用都会返回一个新的 InputStream。 调用者需要负责关闭流。
  • exists():返回一个boolean值,用于判断当前资源是否存在。
  • isOpen():返回一个boolean值,判断当前资源是否是一个已打开的 InputStream。如果为 true,则不能多次读取InputStream ,必须只读取一次,然后关闭以避免资源泄漏。除InputStreamResource 外,对于所有常见的资源实现,返回false。
  • getDescription():返回该资源的描述,当处理资源出错时,资源的描述会用于错误信息的输出。一般来说,资源的描述是一个完全限定的文件名称,或者是当前资源的实际URL。

注:
资源抽象不会取代功能。它尽可能地将其包裹起来。例如,UrlResource包装了一个URL,并使用包装后的URL来完成其工作。

常见接口


Resource 一些常见接口:

类型接口
输入流org.springframework.core.io.InputStreamSource
只读资源org.springframework.core.io.Resource
可写资源org.springframework.core.io.WritableResource
编码资源org.springframework.core.io.support.EncodedResource
上下文资源org.springframework.core.io.ContextResource

图解关系如下:
在这里插入图片描述

优缺点


Resource 接口的优缺点:

  • 优点

    • Resource 接口是一个标准接口,可以用于任何资源加载,不管资源是在文件中、在数据库中或其他地方。
    • Resource 接口提供了同步和异步加载方法,可以适应不同的应用场景。
    • Resource 接口可以方便地获取资源的元数据信息,例如资源的大小、修改时间等。
    • Resource 接口支持资源锁定和解锁,可以避免多个线程同时访问同一个资源导致的问题。
  • 缺点

    • Resource 接口需要应用层自己维护资源之间的依赖关系以及管理生命周期,比较麻烦。
    • Resource 接口对内存敏感,如果加载的资源过多可能会导致内存溢出。
    • Resource 接口不支持动态加载和更新资源,需要手动进行操作。

内置Resource实现


Spring 包含几个内置Resource实现:

  • UrlResource
  • ClassPathResource
  • FileSystemResource
  • PathResource
  • ServletContextResource
  • InputStreamResource
  • ByteArrayResource
资源来源前缀描述
UrlResourcefile:、https:、ftp: UrlResource
ClassPathResourceclasspath:ClassPathResource
FileSystemResourcefile:FileSystemResource
PathResourcePathResource
ServletContextResourceServletContextResource
InputStreamResourceInputStreamResource
ByteArrayResourceByteArrayResource

UrlResource


  UrlResource 封装了一个 java.net.URL 对象,用于访问可通过 URL 访问的任何对象,例如文件、HTTPS 目标、FTP 目标等。所有 URL 都可以通过标准化的字符串形式表示,因此可以使用适当的标准化前缀来指示一种 URL 类型与另一种 URL 类型的区别。 这包括:file:用于访问文件系统路径;https:用于通过 HTTPS 协议访问资源;ftp:用于通过 FTP 访问资源等等。

  UrlResource 是由Java代码显式使用UrlResoResource构造函数创建的,但当您调用采用String参数表示路径的API方法时,通常会隐式创建。对于后一种情况,JavaBeans PropertyEditor最终决定创建哪种类型的Resource。如果路径字符串包含一个众所周知的(对属性编辑器来说就是)前缀(例如classpath:),它会为该前缀创建一个适当的专用Resource。但是,如果它不能识别前缀,它会假定该字符串是标准URL字符串,并创建一个UrlResource

ClassPathResource


  ClassPathResource从类路径上加载资源。它使用线程上下文加载器、给定的类加载器或给定的类来加载资源。

  如果类路径资源驻留在文件系统中,但不支持驻留在jar中且尚未(通过servlet引擎或任何环境)扩展到文件系统的类路径资源,则此Resource实现支持解析为java.io.File。为了解决这一问题,各种Resource实现始终支持解析为java.net.URL

   ClassPathResource是由Java代码显式使用ClassPath资源构造函数创建的,但当您调用接受表示路径的String参数的API方法时,通常会隐式创建。对于后一种情况,JavaBeans PropertyEditor识别字符串路径上的特殊前缀classpath:,并在这种情况下创建一个ClassPathResource

FileSystemResource


  FileSystemResource java.io.File 的资源实现。它还支持 java.nio.file.Path ,应用 Spring 的标准对字符串路径进行转换。FileSystemResource 支持解析为文件和 URL。

PathResource


  PathResourcejava.nio.file.Path 的资源实现。它实际上是FileSystemResource的纯java.nio.path.path替代方案,具有不同的createRelative行为。

ServletContextResource


  ServletContextResourceServletContext 的资源实现。它表示相应 Web 应用程序根目录中的相对路径。

  它始终支持流访问和URL访问,但仅当web应用程序归档扩展并且资源在文件系统上时才允许java.io.File访问。无论它是在文件系统上扩展还是直接从JAR或其他类似数据库的地方访问(这是可以想象的),实际上都取决于Servlet容器。

InputStreamResource


  InputStreamResource是指定 InputStream的资源实现。注意:如果该 InputStream 已被打开,则不可以多次读取该流。

ByteArrayResource


  ByteArrayResource是指定的二进制数组的资源实现。它会为给定的字节数组创建一个 ByteArrayInputStream

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论你的支持就是我✍️创作的动力!					  💞💞💞

参考:
spring - Resource 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20398.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go实现socks5服务器

SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…

Web3 智能合约通过数组方式存储更多学生数据

之前的文章 Web3 在Truffle项目中编写出自己的第一个solidity智能合约带大家写了一个相对捡漏的智能合约 这样 每次 我们set 后 都会将原来的数据覆盖掉了 那么 有些人可能会想 那我们弄个数组 将新的数据全部加到数组里不就行了吗? 这个想法其实就很不错 我们可以…

智能汽车的主动悬架工作原理详述

摘要: 本文将详细介绍主动悬架功能原理设计。 主动悬架是车辆上的一种汽车悬架。它使用车载系统来控制车轮相对于底盘或车身的垂直运动,而不是由大弹簧提供的被动悬架,后者的运动完全由路面决定。主动悬架分为两类:真正的主动悬架…

OpenCV 入门教程:轮廓特征和轮廓匹配

OpenCV 入门教程:轮廓特征和轮廓匹配 导语一、轮廓特征二、轮廓匹配三、示例应用3.1 目标识别3.2 形状分析 总结 导语 轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我…

Android 系统的分区介绍

由于Android系统采用Linux架构,所以Android的系统分区可以类比同样采用Linux架构的操作系统(如Windows)。 Android系统分区分类 现在一般常见的Android分区方式共有三种,在不同的Android系统版本上会采用不同的分区方式。 1、传…

应用级监控方案Spring Boot Admin

1.简介 Spring Boot Admin为项目常用的监控方式,可以动态的监控服务是否运行和运行的参数,如类的调用情况、流量等。其中分为server与client: server: 提供展示UI与监控服务。client:加入server,被监控的…

遥感云大数据在灾害、水体与湿地领域案例实践及GPT【洪涝灾害、洪水敏感性和风险模拟、河道轮廓监测、地下水变化、红树林遥感制图】

近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

换零钱II:Python代码解Java题目

银行现存零钱面值种类动态变化但数量无限,类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构,熟悉class的基构造,对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

从CPU缓存结构到原子操作

文章目录 一、CPU缓存结构1.1 CPU的多级缓存1.2 Cache Line 二、写回策略三、缓存一致性问题及解决方案3.1 缓存一致性问题3.2 解决方案3.2.1 总线嗅探3.2.2 事务的串行化3.2.3 MESI 四、原子操作4.1 什么是原子操作4.2 c 标准库的原子类型4.2.1 atomic<T\>4.2.2 is_lock…

这款语音同声翻译软件为你提供智能翻译体验

林娜&#xff1a;嘿&#xff0c;你知道吗&#xff1f;现在有很多语音翻译软件可以帮助我们进行实时的语言翻译&#xff01; 罗伟&#xff1a;真的吗&#xff1f;有什么语音翻译软件呢&#xff1f;能告诉我一些详情吗&#xff1f; 林娜&#xff1a;当然&#xff0c;接下来我将…

SpringBoot+JWT实现单点登录解决方案

一、什么是单点登录? 单点登录是一种统一认证和授权机制&#xff0c;指在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的系统&#xff0c;不需要重新登录验证。 单点登录一般用于互相授信的系统&#xff0c;实现单一位置登录&#xff0c;其他信任的…

AI热潮中的黑马:曾经的显卡制造商是如何跻身AI巨头之列的?

导读&#xff1a;在芯片行业的风云变幻中,英伟达如何从一家显卡制造商翻身成为AI巨头?面对行业迭代速度极快、激烈竞争和显著的高成本特点,英伟达是如何构建属于自己的护城河,又是如何突破技术瓶颈,跑在前列的呢?他们是如何将"摩尔定律"推进到更高阶段创造出属于自…