使用类加载器查找和读取资源
Java 中的资源加载包括以下步骤:
- 找到将找到资源的
Class
或ClassLoader
。 - 寻找资源。
- 获取资源的字节流。
- 读取和处理字节流。
- 关闭字节流。
最后三个步骤通常通过将 URL 传递给库方法或构造函数来加载资源来完成。在这种情况下,你通常会使用 getResource
方法。还可以在应用程序代码中读取资源数据。在这种情况下,你通常会使用 getResourceAsStream
。
绝对和相对资源路径
可以从 classpath 载入资源由表示路径。该路径的语法类似于 UNIX / Linux 文件路径。它由正斜杠(/
)字符分隔的简单名称组成。甲相对路径与名称开始,一个绝对路径与分离开始。
正如 Classpath 示例所描述的那样,JVM 的类路径通过在类路径中覆盖目录和 JAR 或 ZIP 文件的名称空间来定义名称空间。当解析绝对路径时,类加载器会将初始/
解释为命名空间的根。相反,可以相对于命名空间中的任何文件夹 来解析相对路径。使用的文件夹取决于用于解析路径的对象。
获取类或类加载器
可以使用 Class
对象或 ClassLoader
对象定位资源。Class
对象可以解析相对路径,因此如果你有(类)相对资源,通常会使用其中一个。有多种方法可以获得 Class
对象。例如:
-
一类文字会给你,你可以在 Java 源代码名称的任何类的
Class
对象; 例如String.class
为String
类型提供了Class
对象。 -
Object.getClass()
将为你提供任何物体类型的Class
对象; 例如"hello".getClass()
是获得String
类型的另一种方式。 -
Class.forName(String)
方法将(如果需要)动态加载一个类并返回其Class
对象; 例如Class.forName("java.lang.String")
。
通常通过在 Class
对象上调用 getClassLoader()
来获得 ClassLoader
对象。也可以使用静态 ClassLoader.getSystemClassLoader()
方法获取 JVM 的默认类加载器。
get
的方法
拥有 Class
或 ClassLoader
实例后,你可以使用以下方法之一找到资源:
笔记:
-
ClassLoader
和Class
版本方法之间的主要区别在于解释相对路径的方式。Class
方法解析与类包对应的文件夹中的相对路径。ClassLoader
方法将相对路径视为绝对路径; 即在类路径命名空间的根文件夹中解析它们。
-
如果找不到所请求的资源(或资源),则
getResource
和 getResourceAsStreammethods return
null, and the
getResourcesmethods return an empty
Enumeration`。 -
返回的 URL 将使用
URL.toStream()
解析。它们可以是file:
URL 或其他常规 URL,但如果资源位于 JAR 文件中,它们将是标识 JAR 文件及其中特定资源的 50 个 URL。 -
如果你的代码使用
getResourceAsStream
方法(或URL.toStream()
)来获取InputStream
,则它负责关闭流对象。未能关闭流可能导致资源泄漏。