Java打包之后读取Resources下的文件失效原因及解决方法

 更新时间:2023年12月07日 10:10:34   作者:Huterox  
这篇文章主要给大家介绍了Java打包之后读取Resources下的文件失效的问题分析和解决方法,文中通过代码示例和图文结合给大家讲解非常详细,需要的朋友可以参考下

环境

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

那么问题就出现在Java打包之后执行代码的时候出现了问题。 在resources下面的话有一个cars.xlsx文件

起初在我们的 idea环境下面测试一点问题没有,直到,我将其打包,并且仔细检查了jar包发现文件资源也打包进去之后,程序还是没有读取到文件的时候,于是发现了一个关于关于使用:

类名.class.getResource("/cars.xlsx").getPath();

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

Why

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

 URL resource = Application.class.getResource("/cars.xlsx");
 String path = resource.getPath();

返回结果是:

显然这个路径是这个:

这个是由IDEA自己生成的一个路径,而在我们打包的时候问什么读取呢? 那么这个时候我们显然需要去看看打包之后的情况:

显然打包到的文件,不在com的同级目录下。

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

解决

okey,解决的方式很简单:

类名.class.getClassLoader().getResourceAsStream("名字");

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

对于Class.getResource:

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

对于ClassLoader.getResource:

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

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

so,写的时候:

类名.class.getClassLoader().getResourceAsStream("名字");

总结

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

以上就是Java打包之后读取Resources下的文件失效原因及解决方法的详细内容,更多关于Java打包后读取Resources下文件失效的资料请关注脚本之家其它相关文章!

相关文章

  • Java命名规则详细总结

    Java命名规则详细总结

    Class名应是首字母大写的名词。命名时应该使其简洁而又具有描述性。异常类的命名,应以Exception结尾。Interface的命名规则与Class相同
    2013-10-10
  • Java实现在线聊天室(层层递进)

    Java实现在线聊天室(层层递进)

    这篇文章主要为大家详细介绍了Java实现在线聊天室,层层递进,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 2022版IDEA创建一个maven项目的超详细图文教程

    2022版IDEA创建一个maven项目的超详细图文教程

    IDEA是用于java语言开发的集成环境,并且经常用于maven、spring、MyBatis等项目的开发,下面这篇文章主要给大家介绍了关于2022版IDEA创建一个maven项目的超详细图文教程,需要的朋友可以参考下
    2023-02-02
  • Java应用CPU使用率过高排查方式

    Java应用CPU使用率过高排查方式

    这篇文章主要介绍了Java应用CPU使用率过高排查方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mybatis-plus 如何操作json字段

    mybatis-plus 如何操作json字段

    这篇文章主要介绍了mybatis-plus 如何操作json字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • SpringBoot使用拦截器Interceptor实现统一角色权限校验

    SpringBoot使用拦截器Interceptor实现统一角色权限校验

    角色权限校验,是保证接口安全必备的能力:有权限才可以操作,所以,一般对于这种通用逻辑,推荐不与主业务逻辑耦合,那么怎么来解耦,那么本文小编就给大家详细讲解如何使用拦截器Interceptor实现统一角色权限校验,需要的朋友可以参考下
    2023-07-07
  • spring boot整合kafka过程解析

    spring boot整合kafka过程解析

    这篇文章主要介绍了spring boot整合kafka过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot调用service层的三种方法

    SpringBoot调用service层的三种方法

    在Spring Boot中,我们可以通过注入Service层对象来调用Service层的方法,Service层是业务逻辑的处理层,它通常包含了对数据的增删改查操作,本文给大家介绍了SpringBoot调用service层的三种方法,需要的朋友可以参考下
    2024-05-05
  • 详解在springboot中使用Mybatis Generator的两种方式

    详解在springboot中使用Mybatis Generator的两种方式

    这篇文章主要介绍了详解在springboot中使用Mybatis Generator的两种方式,本文将介绍到在springboot的项目中如何去配置和使用MBG以及MBG生成代码的两种方式,非常具有实用价值,需要的朋友可以参考下
    2018-11-11
  • java压缩文件与删除文件的示例代码

    java压缩文件与删除文件的示例代码

    这篇文章主要介绍了java压缩文件与删除文件的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论