记一次Java打包之后读取Resources下的文件失效的事情

前言

okey,最近经历的事情有点多,事情有点杂,开始慢慢恢复记忆了。咱的优势就是学的快,劣势就是较高的学习能力,与容量有限的大脑存在主要矛盾。由于硬件本身存在的问题,导致大脑不得不选择LRU与LFU替换策略。因此在重新调入脑存时,中断时间较长。

环境

okey,废话不多说,发车了,事情的起因还是源于一道面试笔试机试题目(这里不能透露太多,但是这道题目很有意思,是一个算法应用,并且这个算法本身也挺有意思的。写完算法之后,还要放在Linux环境当中进行远程调试,说明执行流程)

那么问题就出现在Java打包之后执行代码的时候出现了问题。 在resources下面的话有一个cars.xlsx文件 起初在我们的 idea环境下面测试一点问题没有,直到,我将其打包,并且仔细检查了jar包发现文件资源也打包进去之后,程序还是没有读取到文件的时候,于是发现了一个关于关于使用:

python 复制代码
类名.class.getResource("/cars.xlsx").getPath();

读取resources的坑。打包之后,它是无法读取到文件的。

Why

发现问题,那么就要解决问题,那么问题在哪,凭什么不ok呢。 那么竟然如此,那么我们就要look,look,这个玩意输出的是什么:

python 复制代码
 URL resource = Application.class.getResource("/cars.xlsx");
 String path = resource.getPath();

返回结果是: 显然这个路径是这个: 这个是由IDEA自己生成的一个路径,而在我们打包的时候问什么读取呢? 那么这个时候我们显然需要去看看打包之后的情况: 显然打包到的文件,不在com的同级目录下。

ok,这里我们就明白了一个道理,那就是,之所以找不到,那就是这个打包之后的文件位置放的不一样。那么问题提出来了,那么如何解决这个问题

解决

okey,解决的方式很简单:

python 复制代码
类名.class.getClassLoader().getResourceAsStream("名字");

欸,这样一看,好像区别不大啊,为毛这个可以解决这个问题呢?

对于Class.getResource:

先获取文件的路径path,不以'/'开头时,默认是从此类所在的包下取资源;path以'/'开头时,则是从项目的ClassPath根下获取资源。所以在当前打包之后的 话,我们找不到的,因为这个文件还在外面一层。

对于ClassLoader.getResource:

同样先获取文件的路径,path不以'/'开头时,首先通过双亲委派机制,使用的逐级向上委托的形式加载的,最后发现双亲没有加载到文件,最后通过当前类加载classpath根下资源文件。这样一来当前类没找到,但是老爹,老爷,太爷能找到。

在classLoader里面它的一个过程是这样的:

so,写的时候:

python 复制代码
类名.class.getClassLoader().getResourceAsStream("名字");

总结

陆续开始恢复技术学习,停止考研学习。考研很好,但是不是适合所有人。不过话说回来,太久没老老实实写代码了,好多东西都忘了,今天上午在做远程调试的时候,一直连接不上去,防火墙也放行了,结果搞了半天,发现策略组没放行,无语住了。

相关推荐
Java爱好狂.34 分钟前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
马良神笔3 小时前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD3 小时前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
高频因子挖掘机3 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机3 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
团子哒哒5 小时前
数组、切片和Map
后端
专注仿真5 小时前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷5 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m555555555 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
易小尊5 小时前
我的模型在 65% 以上时准得可怕,在 50% 时像在掷硬币
后端