首页 > 其他分享 >为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?

为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?

时间:2023-12-14 11:05:01浏览次数:32  
标签:src String ClassLoader getResource main resources 加载


为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?


文章目录

  • 为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?
  • 1、类路径和资源文件
  • 2、ClassLoader 的层次结构
  • 3、getResource 方法的工作原理
  • 4、使用 `ClassLoader` 类图示
  • 5、仅使用 `FileInputStream` (不推荐,也不合理)


在 Java 开发中,ClassLoader 类是一个关键的组件,用于加载类和资源。其中,getResource(String name) 方法允许我们在类路径中查找指定名称的资源文件。一个常见的疑问是:为什么这个方法能够轻松地读取到Maven项目中src/main/resources目录下的文件呢?

1、类路径和资源文件

在Maven项目中,源代码通常存放在src/main/java目录下,而资源文件则存放在src/main/resources目录下。这样的组织结构是为了在构建过程中能够清晰地分离代码和资源。

在编译时,Maven将src/main/resources目录下的文件复制到类路径中,通常是target/classes目录。这意味着编译后,资源文件就变成了类路径的一部分。

2、ClassLoader 的层次结构

ClassLoader 类的设计支持层次结构,其中每个类加载器都有一个父类加载器。当类加载器需要加载类或资源时,它首先会尝试从父加载器中查找,然后再从自身的类路径中查找。

这机制为ClassLoader提供了一种委托机制,确保资源的查找是层次化的,逐级向上寻找,直至找到为止。

3、getResource 方法的工作原理

ClassLoadergetResource(String name) 方法实际上是利用了这一层次结构的委托机制。它首先尝试调用父加载器getResource 方法,如果父加载器找不到资源,再从自己的类路径中查找。这保证了在整个类加载器层次结构中,资源文件可以被有效地定位。

因此,当我们使用ClassLoadergetResource 方法时,它会顺着类加载器的层次结构,最终在编译后的类路径中找到src/main/resources目录下的文件。

4、使用 ClassLoader 类图示

为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?_资源文件

5、仅使用 FileInputStream (不推荐,也不合理)

该路径是相对路径,并且是相对于项目的根目录的。

这么写是不合理的!

为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?_类加载器_02


标签:src,String,ClassLoader,getResource,main,resources,加载
From: https://blog.51cto.com/u_13272819/8815671

相关文章

  • import引入pdfjs-dist报错Top-level await is not available、No "GlobalWorkerOption
    项目环境//1.npmlsvite├─┬@vitejs/[email protected]│└──[email protected]├─┬@vitejs/[email protected]│└──[email protected]├─┬[email protected]│└──[email protected]├─┬[email protected]│└......
  • 无涯教程-Java - toString()函数
    该方法用于获取表示Number对象值的String对象。toString()-语法以下是此方法的所有变体-StringtoString()staticStringtoString(inti)这是参数的详细信息-i   - 将为其返回字符串表示形式的int。toString()-返回值toString()     - 这将返......
  • %d占位符和StringBuffer 和+ 操作符,谁的效率更高?
    在处理字符串拼接时,使用%d占位符和StringBuffer、StringBuilder类以及+操作符的效率是不同的。%d占位符:占位符%d通常用于格式化整数类型的数据。使用占位符的方式可以方便地将数字转换为字符串并插入到指定位置。这种方式在性能上相对较高,因为它直接进行格式化操作,不......
  • String字符串
    String字符串String类是定义在java.lang下面的,是定义好的一个类,使用的时候不需要导包。字符串不可变,他们的值在创建后不能被更改。比较:==号:如果是基本数据类型,则比较的是数据值,如果是引用数据类型,比较的是地址值equals:完全一样的结果才是true,否则是falseequalsIgnor......
  • C++语言string、wstring、utf-8互转
    实现了一个CStrCvt类,采用STL实现,可跨平台。注意的是,在s2ws和ws2s函数中需要locale信息,在使用过程中,需要根据实际情况进行设置。如果有需要可以检测文本编码,网上有开源的第三方库,可供使用。不过,准确率需自己判断。为了不影响效率,此类默认按照中文处理。头文件classCStrCvt{pu......
  • java String类
    一、JDKAPI帮助文档1、在线文档地址https://docs.oracle.com/javase/8/docs/api/2、离线文档地址https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html 二、String1、定义 2、常见的String构造方法示例: 3、特点   4、字符串的......
  • 【Cpp 语言基础】简单聊一聊to_string
    头文件:#include<string>功能:将数字常量转换为字符串参数:value返回值:转换好的字符串重载版本:std::stringto_string(intvalue);(1)(C++11起) std::stringto_string(longvalue);(2)(C++11起) std::stringto_string(longlongvalue);(3)(C++11起) std::stringto......
  • string 的扩容机制
    C++string类的扩容机制主要取决于编译器的实现,但一般来说,它们都遵循一种动态数组的策略,即当字符串的大小超过当前容量时,就会分配更大的内存空间。以下是一种常见的扩容策略1:size_type_Grow_to(size_type_Count)const{size_type_Capacity=capacity();if(_Capac......
  • sql中的substring()、to_char()、extract()、concat()等函数
    ERROR:functionpg_catalog.substring(timestampwithouttimezone,integer,integer)doesnotexistLINE1:SELECTu.username,l.description,l.ip,SUBSTRING(l.createdate,…^HINT:Nofunctionmatchesthegivennameandargumenttypes.Youmightneedtoadde......
  • Java 中日期String类型与Date类型相互转化
    JavaString类型转换成Date日期类型插入数据库时,存入当前日期,需要格式转换importjava.text.SimpleDateFormat;formatter=newSimpleDateFormat("yyyy-MM-dd");Stringdate=formatter.format(newDate());//格式化数据,取当前时间结果为2014-10-30String格式的数据转化成......