Resource你不得不知的事情
前言
我们为什么要学习Spring下面的Resource模块?
首先我们要了解什么是资源,我们把资源来自于几个方面:比如spring中xml配置文件,url网络上不同渠道的资源,自建的properties文件等,程序对于这些资源的访问,被称之为资源访问。
我们在学习spring之前,接触过一些资源访问API,比如InputStream等文件的IO,java.net.URL。
首先,它们都不是专门为Web服务设计的,对于Spring服务,这些工具比较底层,直接使用这些方法,首先要编写更多额外的代码,比如文件是否存在的判断,路径转换。
其次,他们对于访问底层资源的能力不够,没有一种URL的实现可以访问需要从类路径的资源或者相对于ServletContext获得的资源,虽然可以为专门的URL前缀注册新的处理程序(类似于现有的用于前缀的处理程序:如http:),但是比较复杂。而且URL缺少需要的一些功能,比如检查被指向的资源是否存在的方法(上面提到过,原理在于,URL表示一个统一的资源定位符,一个指向互联网上“资源”的指针,较于Resource更侧重于web资源,而Resource是实现资源的抽象,可以检查资源是否存在)。
Spring整合了获取资源的工具,统一读取例如本地文件,classpath项目路径下的文件,url互联网上的文件等不同渠道的资源,也封装了打开流,关闭流,报错处理等大量重复模板的代码,专程设计Resource接口类。
Resource内容
继承结构
代码如下:
public interface Resource extends InputStreamSource
InputStreamSource接口:spring核心工具包输入流接口,该接口只有一个抽象方法,每次调用这个方法都会得到一个新的流。
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
DOC解释
* Interface for a resource descriptor that abstracts from the actual
* type of underlying resource, such as a file or class path resource.
*从实际类型的底层资源(例如文件或类路径资源)中抽象出来的资源描述符的接口
提供的功能
boolean exists();//返回Resource所指向的底层资源是否存在
default boolean isReadable() {
//返回当前Resource代表的底层资源是否可读
return exists();
}
default boolean isOpen() {
//返回Resource资源文件是否已经打开,如果是,则只能被读取一次然后关闭以避免内存泄漏
//常见的Resource实现一般都返回false
return false;
}
//如果当前Resource代表的底层资源能由java.util.URL代表,则返回URL,否则抛出io异常
URL getURL() throws IOException;
//如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出io异常
URI getURI() throws IOException;
// 如果当前Resource代表的底层资源能由java.io.File代表,则返回FIle,否则抛出io异常
File getFile() throws IOException;
//返回当前Resource代表的底层资源的长度,一般是值代表的文件资源的长度。
long contentLength() throws IOException;
//返回当前Resource代表的底层资源的最后修改时间。
long lastModified() throws IOException;
@Nullable
//返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://E:/hao/wang.txt”将返回“E:/hao/wang.txt