记一次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("名字");

总结

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

相关推荐
IT_陈寒8 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码9 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo9 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志10 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..10 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects10 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰10 小时前
一些基础和问题解决
后端
陈随易10 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN11 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana11 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端