Resource
Resource 接口
不幸的是,Java的标准
Java.net.URL
类和各种URL前缀的标准处理程序对于所有对低级资源的访问来说都不够充分。例如,没有标准化的URL实现可以用于访问需要从类路径或相对于
Servlet
上下文获得的资源。虽然可以为专用URL前缀注册新的处理程序(类似于http:等前缀的现有处理程序),但这通常相当复杂,并且URL接口仍然缺乏一些所需的功能,例如检查所指向的资源是否存在的方法。
介绍
Java的标准
Java.net.URL
类和各种URL前缀的标准处理程序对于所有对低级资源的访问来说都不够充分,基于此,Spring 的
org.springframework.core.io.Resource
接口旨在成为一个更强大的接口,用于抽象对低级资源的访问,有关
Resource
接口的更多详细信息,参考Resource。
publicinterfaceResourceextendsInputStreamSource{booleanexists();booleanisReadable();booleanisOpen();booleanisFile();URLgetURL()throwsIOException;URIgetURI()throwsIOException;FilegetFile()throwsIOException;ReadableByteChannelreadableChannel()throwsIOException;longcontentLength()throwsIOException;longlastModified()throwsIOException;ResourcecreateRelative(String relativePath)throwsIOException;StringgetFilename();StringgetDescription();}
正如
Resource
接口的定义所示,它扩展了
InputStreamSource
接口。以下列表显示
InputStreamSource
接口的定义:
publicinterfaceInputStreamSource{InputStreamgetInputStream()throwsIOException;}
核心方法
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
资源来源前缀描述UrlResource
file:、https:、ftp:
等
ClassPathResource
classpath:
FileSystemResource
file:
PathResource
–
ServletContextResource
–
InputStreamResource
–
ByteArrayResource
–
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
PathResource
是
java.nio.file.Path
的资源实现。它实际上是
FileSystemResource
的纯
java.nio.path.path
替代方案,具有不同的
createRelative
行为。
ServletContextResource
ServletContextResource
是
ServletContext
的资源实现。它表示相应 Web 应用程序根目录中的相对路径。
它始终支持流访问和URL访问,但仅当web应用程序归档扩展并且资源在文件系统上时才允许
java.io.File
访问。无论它是在文件系统上扩展还是直接从JAR或其他类似数据库的地方访问(这是可以想象的),实际上都取决于
Servlet
容器。
InputStreamResource
InputStreamResource
是指定
InputStream
的资源实现。注意:如果该
InputStream
已被打开,则不可以多次读取该流。
ByteArrayResource
ByteArrayResource
是指定的二进制数组的资源实现。它会为给定的字节数组创建一个
ByteArrayInputStream
。
如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论 你的支持就是我✍️创作的动力! 💞💞💞
参考:
spring - Resource 官方文档
版权归原作者 家有娇妻张兔兔 所有, 如有侵权,请联系我们删除。