Java中Class类和 ClassLoader 类 的 getResource()和 getResourceAsStream()方法的使用

前言

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

getResource()

1. Class类 获取:

在这里插入图片描述

在这里插入图片描述

传统方式 :new File

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

在这里插入图片描述

getResource()

在这里插入图片描述

获取hello.txt

第一种:

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

方法二:

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

在这里插入图片描述

获取hello02.txt

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

在这里插入图片描述

特别注意;

  • 第一;这是在java工程下
  • 第二:注意Project Structure的加载

Files–>Project Structure–>modules–>source 找到resources文件夹,右键选择resourses,右边会出现resource folders
在这里插入图片描述

没有加载的情况 报错
在这里插入图片描述
在这里插入图片描述
设置Project Structure resourses
在这里插入图片描述

2.ClassLoade 类获取;

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

Class.getResource()源码

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

在这里插入图片描述
在这里插入图片描述

Class.getClassLoader.getResourceAsStream(String path)

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

在这里插入图片描述

总结: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”);

在这里插入图片描述

获取hello02.txt

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

在这里插入图片描述

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

在这里插入图片描述

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”);

在这里插入图片描述

SpringBoot工程下获取资源

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

在这里插入图片描述

案例:

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

获取hello.txt

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

在这里插入图片描述

获取hello02.txt

Class.getClassLoader.getResourceAsStream(String path) 记得path不能以’/'开头
在这里插入图片描述

另外的方式:

获取 ClassLoader 的途径

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

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(“hello.txt”);在这里插入图片描述

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值