前言

  • 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异。

getResource()

1. Class类 获取:

java resources 写入 java resources类_java resources 写入

java resources 写入 java resources类_根目录_02

传统方式 :new File

File file = new File(“src\set1\hello.txt”);

java resources 写入 java resources类_类加载器_03

getResource()

java resources 写入 java resources类_根目录_04

获取hello.txt

第一种:

File file = new File(test01.class.getResource(“hello.txt”).getFile());

方法二:

File file = new File(test01.class.getResource("/set1/hello.txt").getFile());

java resources 写入 java resources类_根目录_05

获取hello02.txt

File file = new File(test01.class.getResource("/resource/hello02.txt").getFile());

java resources 写入 java resources类_根目录_06

特别注意;

  • 第一;这是在java工程下
  • 第二:注意Project Structure的加载
Files–>Project Structure–>modules–>source 找到resources文件夹,右键选择resourses,右边会出现resource folders

java resources 写入 java resources类_加载_07

没有加载的情况 报错

java resources 写入 java resources类_根目录_08


java resources 写入 java resources类_根目录_09


设置Project Structure resourses

java resources 写入 java resources类_java resources 写入_10

2.ClassLoade 类获取;

Object.class.getClassLoader().getResource();

Class.getResource()源码

Class.getResource()实际也是先获得类加载器ClassLoader然后再去获取资源

java resources 写入 java resources类_加载_11


java resources 写入 java resources类_类加载器_12

Class.getClassLoader.getResourceAsStream(String path)

:默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。

java resources 写入 java resources类_根目录_13

总结:getResource()

  1. path不以’/'开头时,默认是从此类所在的包下取资源;
  2. path以’/'开头时,则是从项目的ClassPath根下获取资源。在这里’/'表示ClassPath的根目录。
  3. 实际内在是Class.getClassLoader.getResourceAsStream(String path)
  4. Class.getClassLoader.getResourceAsStream(String path)获取资源默认则是从ClassPath根下获取,path不能以’/'开头

getResourceAsStream()

Class.getResourceAsStream(String path) 总结 :

  1. path不以’/'开头时,默认是从此类所在的包下取资源;
  2. path以’/'开头时,则是从项目的ClassPath根下获取资源。在这里’/'表示ClassPath的根目录。
  3. 实际内在Class.getClassLoader.getResourceAsStream(String path)

获取hello.txt

InputStream in = test01.class.getResourceAsStream(“hello.txt”);
InputStream in = test01.class.getResourceAsStream("/set1/hello.txt");

java resources 写入 java resources类_根目录_14

获取hello02.txt

InputStream in = test01.class.getResourceAsStream("/resource/hello02.txt");

java resources 写入 java resources类_java resources 写入_15

同样可以通过Class.getClassLoader.getResourceAsStream(String path) :

java resources 写入 java resources类_java resources 写入_16

Class.getClassLoader.getResourceAsStream(String path)
:默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。

另外的方式:

获取 ClassLoader 的途径

  • 获取当前 ClassLoader:clazz.getClassLoader()
  • 获取当前线程上下文的 ClassLoader:Thread.currentThread().getContextClassLoader()
  • 获取系统的 ClassLoader:ClassLoader.getSystemClassLoader()
  • 获取调用者的 ClassLoader:DriverManager.getCallerClassLoader()

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(“hello.txt”);

java resources 写入 java resources类_类加载器_17

SpringBoot工程下获取资源

注意:springboot 默认资源放在src/main/resource下

java resources 写入 java resources类_java resources 写入_18

案例:

InputStream in = test02.class.getClassLoader().getResourceAsStream(“hello.txt”);

获取hello.txt

  • 默认是从此类所在的包下取资源;

java resources 写入 java resources类_java resources 写入_19

获取hello02.txt

Class.getClassLoader.getResourceAsStream(String path) 记得path不能以’/'开头

java resources 写入 java resources类_java resources 写入_20

另外的方式:

获取 ClassLoader 的途径

  • 获取当前 ClassLoader:clazz.getClassLoader()
  • 获取当前线程上下文的 ClassLoader:Thread.currentThread().getContextClassLoader()
  • 获取系统的 ClassLoader:ClassLoader.getSystemClassLoader()
  • 获取调用者的 ClassLoader:DriverManager.getCallerClassLoader()

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(“hello.txt”);

java resources 写入 java resources类_根目录_21