一文理解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)
上一篇 2022年6月14日 下午2:16
下一篇 2022年6月14日 下午2:16


相关推荐

  • rpm安装gcc

    rpm安装gcc使用原始安装介质,操作系统为RedHatEnterpriseLinuxServerrelease7.4(Maipo)rpm-ivh\gcc-4.8.5-16.el7.x86_64.rpm\cpp-4.8.5-16.el7.x86_64.rpm\glibc-devel-2.17-196.el7.x86_64.rpm\…

    2022年6月12日
    37
  • idea 2022.01.13激活码【中文破解版】2022.02.20

    (idea 2022.01.13激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlHCIQ56F36O-eyJsaWN…

    2022年4月1日
    74
  • 浮点数的阶码,尾数与移码

    浮点数的阶码,尾数与移码阶码与尾数 十进制中通常一个浮点数可以用科学技术法来表示 举例 306 5 可以表示为 0 3065 103 其中 是符号 指数 3 是阶或称阶码 0 3065 是小数部分 nbsp nbsp 左右段非 0 包起来的部分是有效值 nbsp 这里的有效值是 3065 小数部分也称为尾数 显然 3065 也是尾数 3 87 的话 387 是有效值 nbsp 87 是尾数 nbsp nbsp nbsp 因为他可以表示为 3 065 102 nbsp nbsp 也

    2026年3月19日
    3
  • js统计英文单词数量

    js统计英文单词数量js单词数量

    2025年5月26日
    5
  • 机器翻译评价指标之BLEU详细计算过程

    机器翻译评价指标之BLEU详细计算过程1 简介 BLEU BilingualEva 相信大家对这个评价指标的概念已经很熟悉 随便百度谷歌就有相关介绍 原论文为 BLEU aMethodforAu IBM 出品 本文通过一个例子详细介绍 BLEU 是如何计算以及 NLTKnltk align bleu scor

    2026年3月19日
    3
  • 虚拟ip地址是如何实现的_虚拟服务器ip地址

    虚拟ip地址是如何实现的_虚拟服务器ip地址ARP是地址分析协议,其作用简单,将ip地址转换为MAC地址,使用于数据链路层。每个主机都有一个ARP高速缓存,存储同一网络中的IP地址与MAC地址之间的对应关系,当以太网中的主机发送数据时,首先要从该缓存中查询与目标IP相对应的MAC地址,并将数据发送到该MAC地址。该系统将自动维护此缓存。ARP高速缓存可以在Linux下使用arp命令。例如,物理机器A(IP为172.25.0.1)和物理机器B…

    2022年10月12日
    9

发表回复

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

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