【Spring | 资源处理】

news2024/12/24 21:32:26

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.coloradmin.cn/o/748886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Buck电路的原理及器件选型指南

Buck电路工作原理 电源闭合时电压会快速增加,当断开时电压会快速减小,如果开关速度足够快的话,是不是就能把负载,控制在想要的电压值以内呢? 假设12V降压到5V,也就意味着,MOS管开关需要42%时间导通&#…

java每日一题:手动触发垃圾回收(GC)

面试官: 首先,我想问一下,你能向我解释一下"手动触发Java垃圾回收"的过程吗?🤔 面试者: 在Java中,垃圾回收是自动进行的,由Java虚拟机(JVM)负责管理。但是,有…

Linux进程(一)---深入了解进程的概念及状态

目录 什么是进程 如何管理进程 描述进程 PCB到底是什么? PCB的内容分类 组织进程 查看进程 ps命令 通过系统调用获取进程标示符 getpid() getppid() 通过系统调用创建进程-fork初识 进程状态 运行态(R) 阻塞态(S) 阻塞态 挂起态 和就绪态的区别 …

【UE4 C++】07-角色运动设置

效果 可以看到我们可以通过WASD控制角色前后左右移动,通过鼠标控制摄像机旋转朝向。 步骤 1.在虚幻商城中搜索“Gideon”,将该免费资源添加到工程中(大概2.6G) 2. 打开之前创建的“PlayerCharacter” 选中网格体组件&#xff0…

华为OD机试真题 Java 实现【不开心的小朋友】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 大家好,我是哪吒。 做技术,我是认真的,立志于打造最权威的华为OD机试真题专栏,帮助那些与我有同样需求的人&#xff…

C# 参数传递(引用类型参数)

目录 一,引言 二,引用类型参数作为值参数传递 三,引用类型参数作为引用参数传递 一,引言 方法中参数的传递方式主要有值参数传递和引用参数传递(ref,out),而参数有可以分为值类型…

巩固一下NodeJs

1、初始化(确保当前电脑有node环境) npm init 2、安装express npm i expressnpm i ws文件结构 3、编写相关代码启动node服务(server.js) //导入下列模块,express搭建服务器,fs用来操作文件、ws用来实现webscoket const express require("expr…

使用halcon深度学习实现缺陷检测

使用halcon深度学习实现缺陷检测 前言 Halcon是一种功能强大的机器视觉库,提供了许多用于图像处理和分析的工具和算法。它也集成了深度学习算法,可以用于缺陷检测和其他视觉任务。下面是一些使用Halcon深度学习算法实现缺陷检测的步骤: 1.…

写好“提示”改变“智造未来”-GPT4提示词驶入代码优化驾驶座心得

开篇 在前端科技的新浪潮中,Artificial Intelligence (AI)的逐渐成熟与发展引领着我们向前。其中OpenAI的GPT4提供了我们一种新的可能,帮助我们优化代码,使编程变得更加轻松。在这篇文章中,我们将一同探究如何在1-2分钟内,依靠GPT的提示词优化我们的代码,并展现出我们在…

F - Weight of the System of Nested Segments - 思维+排序

分析&#xff1a; 将每个点的权重以及坐标存下来&#xff0c;按权重排序&#xff0c;找出前n个点然后按坐标排序&#xff0c;再按要求输出最大区间到最小区间。 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long ll; typedef pair<in…

Python高频面试题——如何实现列表去重

在招聘Python自动化测试岗位面试时&#xff0c;最常问的一个编码实战问题就是&#xff1a; 一个包含多个值的列表&#xff0c;但存在重复值&#xff0c;如何实现去重&#xff1f;当然大家也可以结合实际业务情况进行提问&#xff0c;例如&#xff1a;统计今天有多少个不同的用…

Day51|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 1.题目&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff0…

电脑如何提高图片dpi分辨率?在线修改图片dpi的操作方法

想要给微信换个背景图片&#xff0c;但是又发现像素尺寸不合适&#xff0c;需要调整图片大小&#xff08; https://www.yasuotu.com/size&#xff09;&#xff0c;那么怎么可以修改图片大小呢&#xff1f;今天分享的这款图片处理工具可以快速将图片大小修改&#xff0c;一起来看…

线性代数 4 every one(线性代数学习资源分享)

Linear Algebra 4 Every One 版权说明&#xff0c;以下我分享的都是一个名叫Kenji Hiranabe的日本学者&#xff0c;在github上分享的&#xff0c;关于Gilbert Strang教授所撰写的《Linear Algebra for Everyone》一书的总结&#xff0c;更像是一个非常精美的线性代数手册&#…

深入解析 MQTT 中基于 Token 的认证和 OAuth 2.0

除了前几篇文章中提到的认证方法&#xff0c;本文将对其他认证方法进行深入分析和探讨。 具体而言&#xff0c;我们将深入了解基于 Token 的认证和 OAuth 2.0&#xff0c;阐述它们的原理并展示它们在 MQTT 中的应用。 基于 Token 的认证 让我们先来认识一下基于 Token 的认证…

网站窗口标题旁的图标生成与替换

电脑端浏览器打开网站后窗口顶部的标签标题左边会有一个网站图标的显示&#xff0c;那个图标需要的是 .ico 格式的文件 在线免费生成ico图标的网址 只需要打开网址选择文件、选择尺寸生成下载&#xff0c;然后放到个人项目中&#xff08;一般放在public目录中&#xff09;&am…

IDEA中右侧栏和底部栏不见了

IDEA中右侧栏和底部栏不见了 在开发中&#xff0c;IDEA的右侧栏目maven、database等栏目不见了 右侧栏中和底部没东西。 问题解决&#xff1a; View—>Appearance–>Tool Windows Bars 选中即可。 选中之后&#xff0c;出现

mac安装Golang开发环境及快速入门

目录 一、Mac brew 安装go环境 1.1 安装步骤 1.2 设置GOPATH 及环境变量 1.3 编写第一个go程序 二、快速入门 1.1 快速入门需求 1.2 go学习&#xff08;自用&#xff09; 一、Mac brew 安装go环境 1.1 安装步骤 1&#xff09;终端输入&#xff0c;也可以指定下载go版本…

黑客(信息安全网络安全)自学手册

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 行为&#xff1a;从编程开始掌握&#xff0c;前端后端、通信协议、什么都学。 缺点&#xff1a;花费时间太长、实际向安全过渡后可用到的关键知识并不多。…

uniapp自定义头部,计算状态栏和导航栏高度超简单三步

效果图 1.pages.json 页面给要自定义头部的页面加入一行代码 "navigationStyle":"custom" {"path": "pages/index/index","style": {"navigationBarTitleText": "","navigationStyle":"…