# 2.3内置资源实现

Spring有如下几种资源实现：

* UrlResource
* ClassPathResource
* FileSystemResource
* ServletContextResource
* InputStreamResource
* ByteArrayResource

## 2.3.1. UrlResource

UrlResource封装了java.net.URL，可用于访问通常可通过url访问的任何对象，如文件、HTTP目标、FTP目标和其他对象。所有URL都有一个标准化的字符串表示法，这样就可以使用适当的标准化前缀来表示一个URL类型与另一个URL类型。这包括file：用于访问文件系统路径，HTTP：用于通过HTTP协议访问资源，FTP：用于通过FTP访问资源，以及其他。

URL资源是由Java代码通过显式使用UrlResource构造函数创建的，但通常在调用API方法时隐式创建，该API方法需要表示一个路径的字符串参数。对于后一种情况，JavaBeans属性编辑器最终决定要创建哪种类型的资源。如果路径字符串包含已知（即）前缀（如classpath:），它将为该前缀创建适当的专用资源。但是，如果它不识别前缀，则假定该字符串是标准的URL字符串，并创建一个UrlResource。

## 2.3.2. ClassPathResource

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

如果类路径资源驻留在文件系统中，而不是驻留在JAR中且未暴露给filesystem（由servlet引擎或其他环境），则此资源实现支持解析为java.io.File。为了解决这个问题，各种资源实现总是支持将解析作为java.net.URL。

ClassPathResource由Java代码通过显式使用ClassPathResource构造函数创建，但通常在调用API方法时隐式创建，该API方法需要表示一个路径的字符串参数。对于后一种情况，JavaBeans属性编辑器识别字符串路径上的特殊前缀ClassPath:，并在这种情况下创建ClassPathResource。

## 2.3.3. FileSystemResource

他是java.io.File和java.nio.file.Path的Resource实现，支持解析为File或者URL。

## 2.3.4. ServletContextResource

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

通常来说它支持stream和URL访问，但如果web应用程序被web容器解压，资源存在于真实的文件系统中时，也可以用java.io.File来访问。

是否被解压到文件系统，还是作为JAR包来运行，取决于web容器。

## 2.3.5. InputStreamResource

InputStreamResource 是InputStream 的Resource实现。只有在其他Resource实现不可用的时候才考虑使用它。特别的，可以考虑使用ByteArrayResource或者其他的 file-based Resource实现。

和其他的Resource实现相反，它是一个already-opened resource的描述器，所以isOpen()会返回true。 如果你想保存资源描述器或者多次读取一个stream， 那么不要使用它。

## 2.3.6. ByteArrayResource

是byte array的Resource实现， 它创建了ByteArrayInputStream。

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.flydean.com/spring-framework-documentation5/core-technologies/2.resources/2.3build-in-resource-impl.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
