使用类加载器查找和读取资源

Java 中的资源加载包括以下步骤:

  1. 找到将找到资源的 ClassClassLoader
  2. 寻找资源。
  3. 获取资源的字节流。
  4. 读取和处理字节流。
  5. 关闭字节流。

最后三个步骤通常通过将 URL 传递给库方法或构造函数来加载资源来完成。在这种情况下,你通常会使用 getResource 方法。还可以在应用程序代码中读取资源数据。在这种情况下,你通常会使用 getResourceAsStream

绝对和相对资源路径

可以从 classpath 载入资源由表示路径。该路径的语法类似于 UNIX / Linux 文件路径。它由正斜杠(/)字符分隔的简单名称组成。甲相对路径与名称开始,一个绝对路径与分离开始。

正如 Classpath 示例所描述的那样,JVM 的类路径通过在类路径中覆盖目录和 JAR 或 ZIP 文件的名称空间来定义名称空间。当解析绝对路径时,类加载器会将初始/解释为命名空间的根。相反,可以相对于命名空间中的任何文件夹 解析相对路径。使用的文件夹取决于用于解析路径的对象。

获取类或类加载器

可以使用 Class 对象或 ClassLoader 对象定位资源。Class 对象可以解析相对路径,因此如果你有(类)相对资源,通常会使用其中一个。有多种方法可以获得 Class 对象。例如:

  • 类文字会给你,你可以在 Java 源代码名称的任何类的 Class 对象; 例如 String.classString 类型提供了 Class 对象。

  • Object.getClass() 将为你提供任何物体类型的 Class 对象; 例如 "hello".getClass() 是获得 String 类型的另一种方式。

  • Class.forName(String) 方法将(如果需要)动态加载一个类并返回其 Class 对象; 例如 Class.forName("java.lang.String")

通常通过在 Class 对象上调用 getClassLoader() 来获得 ClassLoader 对象。也可以使用静态 ClassLoader.getSystemClassLoader() 方法获取 JVM 的默认类加载器。

get 的方法

拥有 ClassClassLoader 实例后,你可以使用以下方法之一找到资源:

笔记:

  • ClassLoaderClass 版本方法之间的主要区别在于解释相对路径的方式。

    • Class 方法解析与类包对应的文件夹中的相对路径。
    • ClassLoader 方法将相对路径视为绝对路径; 即在类路径命名空间的根文件夹中解析它们。
  • 如果找不到所请求的资源(或资源),则 getResource 和 getResourceAsStreammethods returnnull, and thegetResourcesmethods return an emptyEnumeration`。

  • 返回的 URL 将使用 URL.toStream() 解析。它们可以是 file: URL 或其他常规 URL,但如果资源位于 JAR 文件中,它们将是标识 JAR 文件及其中特定资源的 50 个 URL。

  • 如果你的代码使用 getResourceAsStream 方法(或 URL.toStream())来获取 InputStream,则它负责关闭流对象。未能关闭流可能导致资源泄漏。