Spring应用手册-Resource接口

x33g5p2x  于2021-09-26 转载在 Spring  
字(3.5k)|赞(0)|评价(0)|浏览(469)

Resource接口

spring应用手册(第五部分)

Spring中整合了获取资源的工具,就是使用Resource接口。此接口是Spring为了统一读取诸如本地文件、classpath项目路径下的文件、url互联网上的文件等不同类型渠道的资源,封装隐藏如打开流、关闭流、报错处理等大量重复模板代码,而专程设计提供的接口类。

看看Resource接口源码:

package org.springframework.core.io;

public interface Resource extends InputStreamSource {
    //返回Resource所指向的底层资源是否存在 
    boolean exists();
	//返回当前Resource代表的底层资源是否可读 
    default boolean isReadable() { /* compiled code */ }
	//返回Resource资源文件是否已经打开,如果返回true,则只能被读取一次然后关闭以避免内存泄漏;常见的Resource实现一般返回false 
    default boolean isOpen() { /* compiled code */ }
	
    default boolean isFile() { /* compiled code */ }
	//如果当前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;

    defaultReadableByteChannel readableChannel() throws IOException { /* compiled code */ }
	//返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。 
    long contentLength() throws IOException;
	//返回当前Resource代表的底层资源的最后修改时间。 
    long lastModified() throws IOException;
	//用于创建相对于当前Resource代表的底层资源的资源
    Resource createRelative(String s) throws IOException;
	//返回当前Resource代表的底层文件资源的文件路径,
    @Nullable
    String getFilename();
	//返回当前Resource代表的底层资源的描述符
    String getDescription();

Resouce接口的父接口InputStreamSource,只有一个方法,用来获取java.io.InputStream对象,这个输入流就指向资源本身:

public interface InputStreamSource {
    java.io.InputStream getInputStream() throws java.io.IOException;
}

Resource接口有以下6个常用的实现类:

[1]UrlResource

UrlResource包装java.net.URL,可用于访问通常可通过 URL 访问的任何 object,例如 files,HTTP 目标,FTP 目标等。所有 URL 都具有标准化的String表示,使得适当的标准化前缀用于指示来自另一个的一种 URL 类型。

UrlResource应该提供标准的协议前缀,一般支持如下资源访问:
http:通过标准的http协议访问web资源,如new UrlResource(“http://地址”); 
ftp:通过ftp协议访问资源,如new UrlResource(“ftp://地址”); 
file:通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”)

但是UrlResource无法解决相对classpath路径或servletContext的处理方法,因此需要其他的Resource实现类。

[2]ClassPathResource

代表classpath路径的资源,将使用ClassLoader进行加载资源。主要优势是方便访问类加载路径下的资源,尤其是Web应用,因为它可以自动搜索位于WEB-INF/classes下的资源文件

	 ClassPathResource加载资源替代了Class类和ClassLoader类的getResource(String name)和getResourceAsStream(String name)两个加载类路径资源方法,提供一致的访问方式。 

我们可以通过下面的方式构造一个ClassPathResource
//使用默认的ClassLoader加载“path”类路径资源; 
public ClassPathResource(String path):
//使用指定的ClassLoader加载“path”类路径资源; 
public ClassPathResource(String path, ClassLoader classLoader)
//使用指定的类加载“path”类路径资源,将加载相对于当前类的路径的资源; 
public ClassPathResource(String path, Class<?> clazz)

当Spring获取资源时,路径字符串前缀是"classpath:",则系统将会自动创建ClassPathResource对象

[3]FileSystemResource

代表java.io.File资源,对于getInputStream操作将返回底层文件的字节流,isOpen将永远返回false,从而表示可多次读取底层文件的字节流。

当Spring获取资源时,路径字符串前缀是"file:",则系统将会自动创建FileSystemResource对象,

我们看一个案例:

File file = new File("d:/test.txt");
Resource resource = new FileSystemResource(file)

[4]ServletContextResource

访问Web Context下相对路径下的资源,入参的资源位置是相对于Web应用根路径的位置(工程文件夹下,WEB-INF所在的那级文件夹)。用于简化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。

使用ServletContextResource无需关心资源是否被解压缩出来,或者直接存放在JAR文件中,都可以通过Servlet容器访问。

创建对象ServletContextResource时需要传入serviceContxt对象和资源文件路径:
ServletContextResource resource = new ServletContextResource(servletContext,"spring.xml");

[5]InputStreamResource

代表java.io.InputStream字节流,对于getInputStream操作将直接返回该字节流,因此只能读取一次该字节流,即isOpen永远返回true。只有当没有合适的Resource实现时,才考虑使用InputStreamResource。一般考虑使用ByteArrayResource

InputStreamResource在构造时需要传入一个InputStream对象:
InputStreamResource resource = new InputStreamResource(inputStream);

[6]ByteArrayResource

ByteArrayResource主要用于加载内存资源,构造时可以传入byte数组。

ByteArrayResource因为入参可以是byte[]类型,所以用途比较广泛,可以把从网络或者本地资源都转换为byte[]类型,然后用ByteArrayResource转化为资源。

ByteArrayResource  resource = new ByteArrayResource("假发的穿戴技巧".getBytes());

相关文章