# Spring教程 - 13 资源操作

在开发的时候,我们经常需要处理各种资源,比如配置文件、图片、模板文件等。Spring 提供了一个强大的资源抽象层,让我们能够以统一的方式访问这些资源,而不用关心它们的具体存储位置。

想象一下,你的应用可能需要从以下地方加载资源:

  • 类路径下(classpath)
  • 文件系统中
  • 网络URL
  • JAR包内部

Spring 的 Resource 接口和 ResourceLoader 接口就是为了解决这些问题而生的。它们提供了统一的API来访问这些不同类型的资源。


# 13.1 Resource 接口

Resource 是 Spring 资源访问的核心接口,它定义了访问资源的基本方法。你可以把它想象成一个更强大的 java.io.File 类,它不仅支持文件系统,还支持类路径、URL等多种资源类型。

Resource 接口定义如下:

public interface Resource extends InputStreamSource {
    // 资源是否存在
    boolean exists();
    
    // 资源是否可读
    boolean isReadable();
    
    // 资源是否已打开
    boolean isOpen();
    
    // 是否代表文件系统中的一个文件
    boolean isFile();
    
    // 获取资源的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;
    
    // 获取资源的文件名
    String getFilename();
    
    // 获取资源的描述信息
    String getDescription();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

Spring 针对不同的资源类型提供了多种 Resource 的实现,常见的实现类如下:

  • ClassPathResource:获取 classpath 下的资源(jar 内也可,但不能 getFile())。
  • FileSystemResource:获取磁盘文件系统中的资源,指定绝对或相对路径。
  • UrlResource:获取 http/ftp/file:// 前缀指定的URL资源。
  • ServletContextResource:获取 web 应用(/WEB-INF/...)下的资源。
  • ByteArrayResource:内存字节数组资源(可重复读取)。
  • InputStreamResource:包装单次可读的 InputStream(注意:通常不可重复读取)。
  • WritableResource:可写资源接口(如某些文件资源实现)。

下面简单演示一下 ClassPathResourceFileSystemResourceUrlResource 的使用。


内容未完......