1. InputStreamSource
意义:封装任何能返回InputStream的类,比如File、Classpath下的资源和ByteArray等
源码:
public interface InputStreamSource {
/**
* Return an {@link InputStream} for the content of an underlying resource.
* <p>It is expected that each call creates a <i>fresh</i> stream.
* <p>This requirement is particularly important when you consider an API such
* as JavaMail, which needs to be able to read the stream multiple times when
* creating mail attachments. For such a use case, it is <i>required</i>
* that each {@code getInputStream()} call returns a fresh stream.
* @return the input stream for the underlying resource (must not be {@code null})
* @throws java.io.FileNotFoundException if the underlying resource doesn't exist
* @throws IOException if the content stream could not be opened
*
* Resource接口封装了底层资源,封装任何能返回InputStream的类
*/
InputStream getInputStream() throws IOException;
}
2. Resource
意义:抽象了所有Spring内部使用到的底层资源File、URL、Classpath等
源码:
public interface Resource extends InputStreamSource {
/**
* 定义了4个判断当前资源状态的方法:存在性、可读性、是否处于打开状态和File类
*/
boolean exists();
default boolean isReadable() {
return exists();
}
default boolean isOpen() {
return false;
}
default boolean isFile() {
return false;
}
/**
* 提供了不同资源到URL、URI、File类型的转换
*/
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
default ReadableByteChannel readableChannel() throws IOException {
return Channels.newChannel(getInputStream());
}
long contentLength() throws IOException;
/**
* 提供了获取lastModified属性和文件名的方法
*/
long lastModified() throws IOException;
String getFilename();
// 提供了基于当前资源创建一个相对资源的方法
Resource createRelative(String relativePath) throws IOException;
// 在错误处理中打印信息
String getDescription();
}
3. 对于不同的资源文件都有相应的Resource实现:FileSystemResource、ClasspathResource、UrlResource、InputStreamResource、ByteArrayResource等
ClasspathResource:getInputStream实现方式是通过class或classLoader提供的底层方法
FileSystemResource:getInputStream实现方式是直接使用FileInputStream对文件进行实例化