为什么ClassPathResource可以读取到流?- 第465篇

历史文章(文章累计460+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

SpringBoot版的低代码开发平台,关联无 SQL - 第462篇

SpringBoot项目打成jar后加载外部配置文件 - 第463篇

线上环境无法读取classpath下的txt文件?- 第464篇

修炼技术的九阳神功,让你从模式小白轻松进阶为模式大神

66个ChatGPT副业赚钱技巧 - 第3篇

ChatGPT+剪映·副业赚钱技巧实战教程·《制作阿凡达解说视频》- 第4篇

悟纤:师傅,你在前面说到《线上环境无法读取classpath下的txt文件?》你没有讲清楚为什么使用ClassPathResource就可以了呢?

师傅:这个么,就有点说,牵涉到了java底层的ClassLoader的机制。

悟纤:那你也和我简单说说吗?

师傅:那师傅就和你说说。但是确实有点难懂,要认真听哦。

悟纤:师傅万岁。

0

导读

在之前有篇文章中《线上环境无法读取classpath下的txt文件?》中说到了解决这个问题的方式就是使用ClassPathResource和class.getResourceAsStream,那为什么这样的方式可以呢?又是什么原理呢?本文带你进行解密。

1

一、ClassPathResource

ClassPathResource是 Spring Framework 中的一个类,用于访问类路径下的资源文件。它可以读取到流,是因为它内部使用了ClassLoader来加载资源文件,而 ClassLoader可以将资源文件转换成 InputStream 流。具体的实现方式是,ClassPathResource内部使用了当前线程的上下文 ClassLoader 来获取资源文件的 URL,然后使用该 URL 打开一个InputStream 流,最终返回给调用者。因此,ClassPathResource 可以方便地读取到类路径下的资源文件,并返回一个 InputStream 流供调用者使用。

使用ClassPathResource 的方法如下:

ClassPathResource resource = new ClassPathResource("path/to/resource");
InputStream inputStream = resource.getInputStream();

其中,path/to/resource是资源文件的相对路径。使用 ClassPathResource 时,需要注意以下几点:

(1)ClassPathResource 只能读取类路径下的资源文件,无法读取其他路径下的文件。

(2)要确保资源文件存在于类路径下,并且在编译后被打包到 jar 或 war 文件中。

(3)资源文件的路径应该使用正斜杠(/)分隔符,而不是反斜杠(\)分隔符。

1

二、class.getResourceAsStream

二、class.getResourceAsStream

class.getResourceAsStream 是 Java 中的一个方法,用于获取类路径下的资源文件的 InputStream 流。它可以读取到流,是因为它内部使用了ClassLoader来加载资源文件,并将其转换为InputStream流。具体的实现方式是,class.getResourceAsStream 方法会根据传入的相对路径,先将其转换为绝对路径,然后使用当前线程的上下文 ClassLoader 来获取资源文件的 URL,最后使用该 URL 打开一个 InputStream 流,并返回给调用者。因此,class.getResourceAsStream 可以方便地读取到类路径下的资源文件,并返回一个 InputStream 流供调用者使用。

在使用class.getResourceAsStream()方法读取类路径下的资源文件时,需要注意以下几点:

(1)路径问题

getResourceAsStream()方法需要传入资源文件的路径,路径的写法有一定的规则。如果资源文件和当前类在同一个包下,可以直接使用文件名作为路径;如果资源文件在当前类的父包或更高级的包中,需要使用相对路径或绝对路径;如果资源文件在classpath下的根目录,需要在路径前加上“/”。

(2)返回值问题

getResourceAsStream()方法返回一个InputStream对象,可以通过该对象读取资源文件的内容。需要注意的是,如果资源文件不存在,该方法返回null。因此,在使用该方法时,需要判断返回值是否为null,避免空指针异常。

(3)编码问题

getResourceAsStream()方法返回的InputStream对象读取的是二进制数据,如果资源文件是文本文件,需要根据文件的编码格式将二进制数据转换成字符串。可以使用Java中的InputStreamReader和BufferedReader类来实现。

(4)路径分隔符

在Windows操作系统中,路径分隔符是“\”,而在Java中,路径分隔符是“/”。因此,在使用getResourceAsStream()方法读取资源文件时,需要使用“/”作为路径分隔符,而不能使用“\”。

总之,在使用class.getResourceAsStream()方法读取类路径下的资源文件时,需要注意路径问题、返回值问题、编码问题和路径分隔符等细节,才能正确地读取文件内容。

2

一、准备工作

三、ClassLoader为什么可以读取到流?

上面两个最终都是ClassLoader加载了,那么为什么ClassLoaer可以加载进来流呐?

ClassLoader是Java中的一个重要机制,用于动态加载类和资源文件。ClassLoader可以从指定的路径中查找并加载资源文件,然后返回一个InputStream对象,以便读取文件内容。ClassLoader可以读取到流的原因如下:

(1)ClassLoader的结构

ClassLoader是Java中的一个类,它可以被看作是类加载器的抽象类。在Java中,ClassLoader是一个层次结构,每个ClassLoader都有一个父ClassLoader,形成了一个树形结构。当需要加载类或资源文件时,ClassLoader会先查询自身的类路径或资源路径,如果找不到,则会委托给父ClassLoader进行查找。这种委托机制保证了ClassLoader可以查找到所有的资源文件。

(2)加载资源文件

当ClassLoader需要加载资源文件时,会通过getResourceAsStream()方法查找资源文件,并返回一个InputStream对象。该方法查找资源文件的顺序是先在ClassLoader自身的类路径或资源路径中查找,如果找不到,则委托给父ClassLoader进行查找。如果父ClassLoader也找不到,则继续委托上级ClassLoader进行查找,直到找到为止。这种查找机制保证了ClassLoader可以查找到所有的资源文件。

(3)读取流

当ClassLoader找到资源文件后,会返回一个InputStream对象,以便读取文件内容。InputStream对象可以读取任意类型的文件,包括文本文件、二进制文件等。因此,ClassLoader可以通过InputStream对象读取任意类型的资源文件,并进行相应的处理。

综上所述,ClassLoader可以读取到流的原因是由于它具有一个层次结构,可以查找到所有的资源文件,并返回一个InputStream对象,以便读取文件内容。这种机制能够满足Java程序动态加载类和资源文件的需求,为Java开发提供了很大的灵活性和扩展性。

4

最近累坏了

最近真的是忙累坏了,主要搞了两个大的时期:

其一:设计模式的书的物资准备和宣传

用“恋爱脑”的角度去解读设计模式,脑洞大开,一阅既懂,核心原理剖析+应用场景实例+前沿技术解读,让你从模式小白轻松进阶为模式大神。

①打造全网最易理解最有趣的设计模式课程体系;

②寓教于乐,学习进阶不再枯燥;

③提升内功,更好的理解框架源码设计思想,封装中间件;

💪值得每位IT人把玩的一本书:https://item.jd.com/13860042.html(长按链接“复制”到浏览器购买,内附详细信息)

如果您更青睐视频学习方式,不妨来此:https://dwz.cn/wqO0MAy7 (长按链接“复制”到浏览器购买,内附详细信息)

一顿饭钱就拿走大神十年心血💔,哈哈,苦BB的IT人(互联网行业形式严峻,希望各位仔都成为金字塔尖的人物)

其二:ChatGPT星球的创建和运营

我也入局了!ChatGPT带来了技术变革之风向,跟随时代步伐和圈内好友,创建了一个ChatGPT知识星球。

持续针对ChatGPT基础操作、最新风向、应用案例、变现方式商业价值等多维度输出干货内容!

正式运营价格定在299,目前地板价78!加入就送独立的 ChatGPT 账号,目前全网断货,我们也不多,送完为止!

并赠送ChatGPT中文站https://csdn.wuqian.fun)永久授权key。

目前已授权ChatGPT中文站试用key:sk-lhtjtestkey24hour0808,左下角点击设置填入后体验试用,24小时后失效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6093.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

68-信号量

文章目录信号量一.什么是信号量二.信号量的接口三.信号量的使用1.思路2.代码3.编译及结果四.ipcs命令信号量 信号量就是控制某个进程能够对某个资源进行访问;保证同一时刻只能由一个进程对 某个资源进程访问; 打印机 一.什么是信号量 信号量是一个特殊的变量,一…

全网最详细的UI自动化测试元素定位方法总结

目录 前言 元素定位概述 常用的元素定位器 元素定位方法 元素定位技巧 总结 前言 UI自动化测试是软件测试中的一个重要环节,它可以通过模拟用户的实际操作,自动化执行UI界面上的测试用例,以提高测试效率和准确性。元素定位是UI自动化测…

卡尔曼滤波浅析

文章目录前言任务状态预测外部影响因素外部不确定性状态更新利用测量进一步修正状态合并两个高斯分布公式汇总图形化解释总结(readme)references前言 Kalman Filter算法,是一种递推预测滤波算法,算法中涉及到滤波,也涉…

数据更新 | CnOpenData法拍房数据

法拍房数据 一、数据简介 法拍房,即“法院拍卖房产”,是被法院强制执行拍卖的房屋 。当债务人(业主)无力履行借款合约或无法清偿债务时,而被债权人经司法程序向法院申请强制执行,将债务人名下房屋拍卖&…

sql注入靶场练习

文章目录Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16Less-17less-18Less-19Less-20Less-1 union没有被过滤,先试出来长度。 ?id1orderby3%23 ?id1orderby4%23到4时,发现 然后再试出来…

JVM与Java体系

JVM体系跟着尚硅谷的康师傅学习 JVM内存与垃圾回收概述 除了大部分的Java开发 人员,除了会在项目中使用到与Java平台相关的框架,与API,对于Java的虚拟机了解甚少。但是也需要我们知道如何处理OOM,SOF异常,除了…

Java实现一个简单的东南西北中的面板

目录 一、前言 二、代码部分 1.代码 三、程序运行结果(面板弹出) 四、涉及到的知识点代码 一、前言 1.本代码是我在上学时写的,有一些地方没能完美实现,请包涵也请多赐教! 2.本弹窗界面可以根据简单的要求进行…

字节跳动CVPR 2023论文精选来啦(内含一批图像生成新研究)

计算机视觉领域三大顶会之一的 CVPR 今年已经开奖啦。 今年的 CVPR 将于六月在加拿大温哥华举办,和往年一样,字节跳动技术团队的同学们收获了不少中选论文,覆盖文本生成图像、语义分割、目标检测、自监督学习等多个领域,其中不少…

Linux 中yum获取的的详细步骤

**1.yum的作用 可以帮我们管理RPM包 可以帮我们安装软件, 如果软件有其他依赖,会帮我们安装依赖后在安装软件 类似于Maven 2.yum命令 search 查询命令或者软件 info 查看包的信息 list / list jdk 查询安装的rpm包,或者只查询某一周 3.更换yu…

【Paper】2016_基于LQR的多智能体系统协同最优控制_姚蒙

姚蒙. 基于LQR的多智能体系统协同最优控制[D].华南理工大学,2016. 文章目录第四章 线性离散时间多智能体系统协同最优控制4.1 引言4.2 离散时间多智能体系统一致最优控制4.3 离散时间领导者-跟随者系统跟踪最优控制4.4 数值仿真Ref第四章 线性离散时间多智能体系统协同最优控制…

HttpRunner3.x(7) hook函数

目录 调用 hook 函数 测试用例层面(testcase)-3.1.11不支持 测试步骤层面(teststep) 编写hook函数 请求request预处理 返回 response 处理 HttpRunner 从 1.4.5 版本开始实现了全新的 hook 机制,可以在请求前和请…

JavaSE——方法的使用

目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 3、递归练习 一、方法的概念及使用 1、…

Java 你还在用lsit.contain做去重? 你是故意的还是不小心的?

前言 最近又是一轮代码review , 发现了一些实现去重的代码,在使用 lsit.contain ...... 如: 我沉思,是不是其实很多初学者也存在这种去重使用问题? 所以我选择把这个事情整出来,分享一下。 正文 首先是造出一个 List&l…

Linux基础教程

Linux 目标 ​ Linux概述【了解】 ​ Linux网络连接三种模式【了解】 Linux目录结构【掌握】 Linux常用命令【掌握】 Linux操作目录的命令【掌握】 Linux操作文件的命令【掌握】 Linux的Vi编辑器【会用】 Linux打包与解压命令【掌握】 一、Linux概述 1、Linux的概述…

动力节点王鹤SpringBoot3学习笔记——第五章 说说Web服务

目录 第五章 说说Web服务 5.1 高效构建Web应用 5.1.1 html页面视图 5.1.2 JSON视图 5.1.3 给项目加favicon 5.2 Spring MVC 5.2.1 控制器Controller 5.2.1.1 匹配请求路径到控制器方法 5.2.1.2 RequestMapping 5.2.1.3 控制器方法参数类型与可用返回值类型 5…

HashMap底层数据结构

TreeMap TreeMap的底层是红黑树,是自平衡的二叉查找树。 在查找元素时会从左子树或右子树查找,和元素一个一个进行比较,对于大数量的查找的场景TreeMap不适合(HashMap解决了这个问题)。 TreeMap的好处,是…

隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测。 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…

两个数组的交集(力扣刷题)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/intersection-of-two-arrays 说…

人大女王金融硕士——站在一个更高的起点,拓宽自己的眼界

俗话说:“视野所及,心之所止”。做任何事情,最重要的是眼光。眼界不一样,就会有不一样的人生。站得更高才能看得更远,看得更远才能收获更多。人民大学与加拿大女王大学金融硕士项目为我们提供在职读研平台,…

Python机器学习:最大熵模型

信息论里,熵是可以度量随机变量的不确定性的,已经证明的:当随机变量呈均匀分布的时候,熵值最大,一个有序的系统有着较小的熵值,无序系统的熵值则较大。 机器学习里面,最大熵原理假设&#xff1…