一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别

一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别基础理解都是实现获取在classpath路径下的资源文件的输入流。为什么是classpath而不是src,因为当web项目运行时,IDE编译器会把src下的一些资源文件移至WEB-INF/classes,classPath目录其实就是这个classes目录。这个目录下放的一般是web项目运行时的class文件、资源文件(xml,properties…);另外,在使用spring…

大家好,又见面了,我是你们的朋友全栈君。

基础理解

都是实现获取在classpath路径下的资源文件的输入流。

为什么是classpath而不是src,因为当web项目运行时,IDE编译器会把src下的一些资源文件移至WEB-INF/classes,classPath目录其实就是这个classes目录。这个目录下放的一般是web项目运行时的class文件、资源文件(xml,properties…);

另外,在使用springboot进行开发时,其目录默认不是WEB-INF而是BOOT-INF,但是其含义是一样的。具体如下图所示:

一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别

上图,蓝框中即为classpath中的内容,也就是自己实际编写的代码,另外依赖的代码主要在lib目录下。

 

再从另外一个视角对比下,编译前后文件所在目录的变化

编译前:

一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别

编译后:

一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别

class是指当前类的class对象,getClassLoader()是获取当前的类加载器,什么是类加载器?简单点说,就是用来加载java类的,类加载器负责把class文件加载进内存中,并创建一个java.lang.Class类的一个实例,也就是class对象,并且每个类的类加载器都不相同。getResourceAsStream(path)是用来获取资源的,而类加载器默认是从classPath下获取资源的,因为这下面有class文件吗,所以这段代码总的意思是通过类加载器在classPath目录下获取资源.并且是以流的形式。

我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。 

不同点

1. class.getClassLoader().getResourceAsStream(String name)

 默认从classpath中找文件(文件放在resources目录下),name不能带“/”,否则会抛空指针

eg:

InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("gamvanclub.cfg.xml");

2. class.getResourceAsStream(String name)

 通过给定名称查找资源,查询资源的规则由给定的类的class load来实现,这个方法由类的loader来执行;如果这个类由bootstrap加载,那么方法由ClassLoader.getSystemResourceAsStream代理执行。

 代理之前,绝对的资源名称通过传入的name参数以下算法进行构造:

 如果name以”/”开头,那么绝对路径是/后边跟的名字

eg:

//从classpath下的config相对路径中读取config.ini"
mypackage.Hello.class.getResourceAsStream("/config/config.ini");

 如果name不是以”/”开头,那么绝对路径是package名”.”换成“/”以后再加name。

eg:

//com.abc.App就是/com/abc/App/name 或者写作 : ../../name(以class所在路径为基准,文件相对于该类的路径)

Java类加载过程

3个步骤:

1.加载,加载类的二进制文件。

2.链接:

  (1)验证,验证字节码的结构是否正确

  (2)准备,给静态成员分配空间并赋予默认值(注意这里:静态变量的第一次赋值是在类加载的时候就进行了,与后面初始化的时候的自定义赋值不是同一过程,也就是静态成员在初始化的时候可能已被赋值二次了)

  (3)解析,将符号引用变为直接引用

3初始化,为静态成员赋予自己给定的初值

类的实例化的顺序:

(1)静态成员、方法与静态代码块的初始化与执行

(2)普通成员、方法与普通代码块的初始化与执行

(3)构造函数的执行(父类的构造函数先执行)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130347.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • spring事件监听(eventListener)

    spring事件监听(eventListener)原理:观察者模式#spring的事件监听有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。事件#事件类需要继承ApplicationEvent,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12…

    2025年6月11日
    0
  • beanshell脚本语法_shell脚本实战pdf免费

    beanshell脚本语法_shell脚本实战pdf免费本文内容是BeanShell入门教程的中文化主要包含了以下内容1.快速入门2.基本语法3.脚本方法4.脚本对象5.范围值快速入门1.下载和运行BeanShell我们可以在http://www.beanshell.org上下载到BeanShell的最新版本,而且可以在图形化桌面模式或者命令行模式下运行。如果你只是想下载下来玩玩看,那么双击JAR文件,运行桌面版的就可以了。但是,或许你更想以后长期使用…

    2025年6月18日
    0
  • Mac idea2022.01.13激活码_最新在线免费激活

    (Mac idea2022.01.13激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    58
  • pytest运行_pytest执行多个py文件

    pytest运行_pytest执行多个py文件前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月31日
    8
  • jettison

    jettisonjson的相关东西真多,最后找到的适合我的情况的json是jettison相关文章jsonjson数组,json字符串解析

    2022年10月22日
    0
  • 常用类

    常用类

    2021年10月2日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号