跳转至

I. 加载资源文件

I. 加载资源文件

更新日期:2021-01-11


1. 概述

使用资源文件是一个很常见的需求。 在Maven工程中,src/main/resources这个目录是默认的存放资源文件的目录,我们也可以自定义其他的目录。

问题是加载资源文件的代码到底怎样写才正确呢?

2. 加载资源文件

有两个名字非常相似的系列函数提供了这一功能,他们是:

  • class.getResource系列
  • classLoader.getResource系列

使用的时候,class和classLoader取得必须要使用和目标资源文件在一个模块中的Java类去取得。 比如,使用我的程序的main函数所在的类取得。

取得class和classLoader对象

1
2
3
4
5
// 假设我的主类是"org.example.App"
// class的取得
App.class.getResource...
// classLoader的取得
App.class.getClassLoader().getResource...

他们在使用的时候也不太一样。class加载资源文件时要以"/"开头,而classLoader不能以"/"开头。 下面来看示例代码:

加载资源文件

1
2
3
4
5
6
7
// 加载文件(假设在src/main/resources目录下有:img/image.png这样一张图片)
// 使用class加载
var url1 = App.class.getResource("/img/image.png");
var inputStream1 = App.class.getResourceAsStream("/img/image.png");
// 使用classLoader加载
var url12 = App.class.getClassLoader().getResource("img/image.png");
var inputStream12 = App.class.getClassLoader().getResourceAsStream("img/image.png");

3. 关于遍历资源文件夹

先说结论:

无法遍历资源文件夹。只能使用资源文件全名一个一个加载。

因为在实际运行的时候,资源文件是在Jar包内部,所以无法像本地文件那样去遍历访问。

要注意的是:classLoader有一个getResources()函数,看起来好像能枚举多个资源文件,然后遍历。但是其实这个函数的行为与我们想象中的大不一样。它并不能实现我们的功能,最好不要使用这个函数。