1-Resource
2020-02-14 本文已影响0人
鹏程1995
背景简介
出现的原因
在java中,将不同来源的资源抽象成 URL,通过注册不同的
handler
(URLStreamHandler
)来处理不同来源的资源读取逻辑。一般 handler 的类型使用不同的前缀(协议)来识别,如"file:","http:","jar:"。
Spring 框架涉及了大量的配置文件,在进行配置文件的读取时没有采用 Java 中的 URL框架,而使用了自己的Resource
框架。未使用 URL 的原因如下:
- 默认的 URL 没有实现相对
Classpath
或者ServletContext
的handler
。我们在做项目时配置文件一般跟着项目包走,大部分还是Classpath
。如果要正常使用,需要了解 URL 的机制并定制对应的"classpath:"的handler
。 - URL 没有提供基本的方法,如检测资源是否存在、是否可读等。
职责
一个统一的 Spring 框架的资源读取接口。用于封装底层资源。
接口继承情况
1.png源码
InputStreamSource
了解
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
这个接口很简单,调用getInputStream()
默认返回对他包装的资源的一个全新的输入流【源是可以支持重复读的,但获得的 Stream 看情况可能不支持重复读】。
Resource
接口介绍
public interface Resource extends InputStreamSource {
/**
* 判断这个 Resource 指定的源是否存在
*/
boolean exists();
/**
* 表明 Resource 指定的源是否可以通过 getInputStream() 进行读取
*/
default boolean isReadable() {
return true;
}
/**
* 表明 Resource 指定的源是否遵循开启关闭。
* 如果是 true ,读取完流之后要记得调用关闭方法。
* 注意: 源是可以重复读的,但是返回的流是不能重读取的,消费了就消费了。
*/
default boolean isOpen() {
return false;
}
/**
* 判断指定的源是否是个文件系统中的文件
*/
default boolean isFile() {
return false;
}
/**
* 返回处理这个源的 URL
*
*/
URL getURL() throws IOException;
/**
* 返回处理这个源的 URI 【也不知道有啥区别】
*/
URI getURI() throws IOException;
/**
*
*/
File getFile() throws IOException;
/**
* 用 ReadableByteChannel 包裹了一下 getInputStream() ,算是增强了。
*/
default ReadableByteChannel readableChannel() throws IOException {
return Channels.newChannel(getInputStream());
}
/**
* 获得源的长度
*/
long contentLength() throws IOException;
/**
*
*/
long lastModified() throws IOException;
/**
* 以当前源的路径为标准创建一个相对路径的 Resource
*/
Resource createRelative(String relativePath) throws IOException;
/**
*
*/
@Nullable
String getFilename();
/**
*
*/
String getDescription();
}