Resource接口的定义
Java 的标准 java.net.URL
类和各种 URL
前缀的标准处理程序不足以满足所有对低级资源的访问。 例如没有标准化的 URL
实现可用于访问需要从类路径或相对于 ServletContext
获取的资源。 虽然可以为专门的 URL 前缀注册新的处理程序(类似于现有的前缀处理程序如 http:
),但这通常相当复杂,并且 URL 接口仍然缺乏一些理想的功能,例如检查是否存在的方法 指向的资源。
针对上述这种情况,Spring 提供了更强大的接口Resource
用于对低级资源的抽象访问,其定义和主要接口方法说明如下。
package org.springframework.core.io;
public interface Resource extends InputStreamSource {
// 特定资源是否存在
boolean exists();
// 内容非空可通过#getInputStream()读取
default boolean isReadable() {
return exists();
}
// 资源对应的InputStream是否已经打开,不能多次读取,应读取后关闭避免资源泄漏
default boolean isOpen() {
return false;
}
// 是否是 File 类型,配合 #getFile()
default boolean isFile() {
return false;
}
// 获取 URL
URL getURL() throws IOException;
// 获取URI
URI getURI() throws IOException;
// 获取 File
File getFile() throws IOException;
// 资源内容长度
long contentLength() throws IOException;
// 上次修改的时间戳
long lastModified() throws IOException;
// 给定路径创建资源
Resource createRelative(String relativePath) throws IOException;
// 获取文件名非全路径
@Nullable
String getFilename();
// 获取资源描述
String getDescription();
}
Resource
接口继承了InputStreamSource
,其定义如下。
package org.springframework.core.io;
public interface InputStreamSource {
// 获取资源对应的 InputStream
InputStream getInputStream() throws IOException;
}
Resource
接口并不是用于完全取代java.net.URL
,而是尽可能地通过其实现类来包装URL
进行处理,如UrlResource
包装一个 URL
并使用包装的 URL
来完成它的的功能。具体看下一节的内置实现。
Resource接口的内置实现
UrlResource
ClassPathResource
FileSystemResource
ServletContextResource
InputStreamResource
ByteArrayResource
UrlResource
UrlResource
包装了 java.net.URL
,可用于访问通常可通过 URL
访问的任何对象,例如文件、HTTP 目标