为什么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小时后失效。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript截取两个符号之间的字符串(2):lastIndexOf匹配和正则表达式匹配

lastIndexOf匹配和正则表达式匹配 项目需求1.规范的字符串2.不规范的字符串3-1.万能封装3-2.ChatGPT的优化写法4.正则表达式的用法5.补充知识:lastIndexOf的用法 项目需求 javascript中截取字符串中最后一个“/”和“?”之间的内容。 1.规范的字符串 https://tes…

chatgpt赋能Python-python_quine

Python Quine: 在Python编程中理解自我复制的魅力 如果您已经开始了编程学习之旅,您就可能听说过Quine。Quine是一种程序,它可以输出自己的源代码,并被称为自我复制程序。这种程序很少出现在编程实践中,但在计算机科学中却发挥着…

chatgpt赋能python:Python分隔符怎么用?

Python分隔符怎么用? 在Python编程中,分隔符是一个非常重要的概念。它可以帮助我们在代码中分隔不同的元素,从而让代码更加易读和易于管理。在本文中,我们将深入探讨Python中分隔符的使用方法。 什么是分隔符? 在Py…

chatgpt赋能Python-python3_8怎么换行

Python是一种高级编程语言,其易用性和简洁语法深受程序员的喜爱。而在Python中,换行是一项必不可少的操作。今天,我们将介绍如何在Python3.8中进行换行,并提供一些有用的技巧。 Python3.8中的换行操作 在Python中,我…

chatgpt赋能python:Python中符号详解

Python中符号详解 Python是一种高级编程语言,使用简洁、优雅的语法非常受欢迎。在Python中,有很多符号,这些符号对于写出优雅、高效的代码至关重要。在本文中,我们将详细介绍Python中的常见符号。 1. 等号(&#xff…

《Java黑皮书基础篇第10版》 第10章【习题】

Java语言程序设计 习题第十章 10.2章节习题 10.1 如果重新定义程序清单102中的Loan类,去掉其中的设置方法,这个类是不可改变的吗? 这个类依然是可以改变的,因为每一笔贷款作为一个对象,都是可以改变的 10.3章节习题 10.2 程序…

【人工智能与机器学习】——线性回归、逻辑回归与分类评价指标(学习笔记)

📖 前言:线性回归(Lincar Regression)模型是最简单的线性模型之一,简而言之就像一元一次函数,是所有机器学习初学者的起点。而逻辑回归(Logistic Regression)则稍显复杂,…

阿里巴巴正在为投资者投下一颗“重磅炸弹”

来源:猛兽财经 作者:猛兽财经 在本文中,猛兽财经将围绕:马云在这个时候回国的意义、阿里巴巴拆分为六大业务集团、为什么张勇将阿里巴巴拆分为六大集团对投资者有利、拆分后阿里巴巴各个集团业务的估值分析、阿里巴巴的财务业绩、…

iOS 摸鱼周报 #82 | 去中心化社交软件 Damus

本期概要 本期话题:设计开发加速器线下活动:女性开发者社区日;本周学习:Python 如何调用 Swift 程序内容推荐:涵盖现代 SwiftUI 编程探讨、可变视图、NSTimer、Swift Charts 等方面的内容摸一下鱼:去中心化…

这才是Excel未来的样子,口喊求和什么的弱爆了

Alex 发自 凹非寺量子位 | 公众号 QbitAI 不知各位是否有过被Excel支配的恐惧? 试想一下表格中密密麻麻的数据、让人云里雾里的工具菜单,还有一堆记不清楚的公式…… 现在,有位大聪明为了简化操作,搞出了一个为Excel而生的AI助手。…

中产,疯狂搞“香港身份”

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 风水轮流转,今朝到香港。去年K哥身边有几个朋友去了新加坡,今年才刚到四月份,就又有朋友开始在想办法搞香港身份了。这些人都是妥妥的中产,年龄在四五十…

聚观早报 | 首个国产新冠药停产;阿里巴巴创始人马云已回国内

今日要闻:首个国产新冠药停产;阿里巴巴创始人马云已回国内;家乐福中国内地首店关闭;好丽友漏税22万被罚12万;苹果iOS 16.4正式版来了 首个国产新冠药停产 腾盛博药的首款商业化产品,新冠中和抗体药物“安巴…

万字长文:一文看懂GPT风口,有哪些创业机会?

“故事发生在未来,2040年通用人工智能系统已经接管了城市的管理。其中一个AI系统的管理者因为妻子的背叛,修改AI系统的一个底层参数——让AI对人类的谎言、背叛怀有深深的厌恶。之后AI在每天对社交平台的监控中看到了无数谎言、背叛,报复的动…

硅谷新王登国会山,呼吁加强 AI 监管;马斯克任命推特新 CEO;数字媒体巨头申请破产;欧盟通过全球首个全面监管加密资产框架 | 经济学人第 21 周

1. 硅谷新王登国会山,呼吁加强 AI 监管 Sam Altman, the chief executive of OpenAI, the firm behind the ChatGPT chatbot, called for tighter regulation of rapidly developing generative artificial intelligence, such as by forcing disclosure on images …

chatgpt赋能python:Python找钱方案:让你的货币计算更加精准

Python找钱方案:让你的货币计算更加精准 Python作为一门流行的编程语言,广泛应用于数据分析、自然语言处理、Web开发等领域。在货币计算方面,Python同样具有优秀的表现,并能够帮助你处理找零、税率等问题。本文将介绍Python中常见…

chatgpt赋能python:Python中的Locals:简介

Python中的Locals: 简介 在Python编程中,locals()函数是一个非常有用的内置函数,它可以返回当前命名空间中的所有局部变量和它们的值。这个函数一般在调试和测试阶段使用,以便帮助开发者跟踪和调试代码中的变量。 在这篇文章中,…

chatgpt赋能python:Python教程:如何进行打折?

Python 教程:如何进行打折? Python 已经成为了世界上最流行的编程语言之一,它拥有丰富的库和工具,可以用于开发各种项目和应用程序。 在这个教程中,我们将介绍如何使用 Python 进行打折。我们将探讨如何使用 Python …

chatgpt赋能Python-python_float_精度

Python Float 精度问题详解——不容忽视的小数位 在处理数据时,我们经常需要使用浮点数。Python中的float数据类型被广泛使用,使得开发人员可以轻松地实现复杂的数学计算、数据分析等功能。然而,在使用Python浮点数时,程序员必须…

快要做外公的盖茨是怎样看ChatGPT和Web3

1月12日下午,微软联合创始人比尔盖茨(Bill Gates)在Reddit上的一年一度Ask Me Anything活动上对时下热门科技概念发表了看法。这是比尔盖茨第11次参加Reddit在线的问答活动,他回答了网友关于世界气候、AI、医疗等方面的问题&#…

JAVA | 学习日记 day8

目录 逻辑运算符 ​编辑 ^符号 例子 三元表达式 例子 标识符的命名规则 键盘输入语句 进制 进制的解释 原码、反码、补码 位运算符 逻辑运算符 遇到& 前后两个语句都要执行 而遇到两个 && 只执行第一个 ^符号 不同则为真 例子 第一个 if 判断…