# 2.3. 内置Resource实现

Spring 包括几个内置的`Resource`实现：

* [`UrlResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-urlresource)
* [`ClassPathResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-classpathresource)
* [`FileSystemResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-filesystemresource)
* [`PathResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-pathresource)
* [`ServletContextResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-servletcontextresource)
* [`InputStreamResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-inputstreamresource)
* [`ByteArrayResource`](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-implementations-bytearrayresource)

有关 Spring `Resource`中可用实现的完整列表，请参阅javadoc [`Resource`](https://docs.spring.io/spring-framework/docs/5.3.22/javadoc-api/org/springframework/core/io/Resource.html)的“所有已知的实现类”部分 。

**2.3.1. `UrlResource`**

`UrlResource`包装了`java.net.URL`并可用于访问通常可通过 URL 访问的任何对象，例如文件、HTTPS 目标、FTP 目标等。所有 URL 都有一个标准化的`String`表示，因此使用适当的标准化前缀来指示一个 URL 类型与另一个 URL 类型。这包括 `file:`访问文件系统路径、`https:`通过 HTTPS 协议访问资源、`ftp:`通过 FTP 访问资源等。

`UrlResource`是由 Java 代码通过显式使用`UrlResource`构造函数创建的，但通常是在调用 API 方法时隐式创建的，该方法采用`String` 表示路径的参数。对于后一种情况，JavaBeans`PropertyEditor` 最终决定创建哪种类型`Resource`。如果路径字符串包含一个众所周知的（对属性编辑器而言）前缀（例如`classpath:`），它会为该前缀创建一个适当的专用化`Resource`。但是，如果它不能识别前缀，它会假定该字符串是标准 URL 字符串并创建一个`UrlResource`.

**2.3.2. `ClassPathResource`**

此类表示应从类路径获取的资源。它使用线程上下文类加载器、给定的类加载器或给定的类来加载资源。

如果类路径资源驻留在文件系统中，则此资源实现支持解析为 `java.io.File`，但不支持驻留在 jar 中且尚未（通过 servlet 引擎或任何环境）扩展到文件系统。为了解决这个问题，各种 `Resource` 实现始终支持解析为 `java.net.URL`。

`ClassPathResource`是由 Java 代码通过显式使用`ClassPathResource` 构造函数创建的，但通常是在调用 API 方法时隐式创建的，该方法采用 `String`表示路径的参数。对于后一种情况，JavaBeans `PropertyEditor`识别字符串路径上的特殊前缀 ,`classpath:`，并在这种情况下创建 `ClassPathResource`。

**2.3.3. `FileSystemResource`**

这是`java.io.File`句柄的`Resource`实现。它还支持 `java.nio.file.Path`句柄，应用 Spring 的标准基于字符串的路径转换，但通过`java.nio.file.Files`API 执行所有操作。对于纯 `java.nio.path.Path`基于支持，请改用 `PathResource`。`FileSystemResource` 支持解析为`File`和 `URL`。

**2.3.4. `PathResource`**

这是句柄的`Resource`实现，通过API 执行所有操作和转换。它支持解析为 a和 as a并且还实现了扩展接口。 实际上是具有不同行为的纯基于替代方案。`java.nio.file.Path``Path``File``URL``WritableResource``PathResource``java.nio.path.Path``FileSystemResource``createRelative`

**2.3.5. `ServletContextResource`**

这是`ServletContext`资源的 `Resource` 实现，它解释相关 Web 应用程序根目录中的相对路径。

它始终支持流访问和 URL 访问，但仅在扩展 Web 应用程序存档且资源物理位于文件系统上时才允许`java.io.File`访问。它是否被扩展并在文件系统上或直接从 JAR 或其他地方（如数据库）访问（这是可以想象的）实际上取决于 Servlet 容器。

**2.3.6. `InputStreamResource`**

`InputStreamResource`是`Resource`给定`InputStream` 的实现。只有在没有特定`Resource`实现适用时才应使用它。特别是，在可能的情况下，首选`ByteArrayResource`或任何基于文件的`Resource` 实现。

与其他`Resource`实现相比，这是一个已打开资源的描述符。因此，它`isOpen()`方法返回`true`。 如果您需要将资源描述符保存在某处或需要多次读取流，请不要使用它。

**2.3.7. `ByteArrayResource`**

这是`Resource`给定字节数组的实现。它为给定的字节数组创建一个 `ByteArrayInputStream`。

它对于从任何给定的字节数组加载内容很有用，而不必求助于单次使用`InputStreamResource`。
