关于web项目读取classpath下面文件的心得分享

 更新时间:2023年07月20日 10:59:44   作者:有逼格d伊凡  
这篇文章主要介绍了关于web项目读取classpath下面文件的心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

web项目读取classpath下面文件的心得

阅读之前须知:本文用到spring的工具类和,commons-io工具类

首先分两大类按web容器分类

一种是普通的web项目,像用Tomcat容器,特点是压缩包随着容器的启动会解压缩成一个文件夹,项目访问的时候,实际是去访问文件夹,而不是jar或者war包

这种的无论你是用获取路径的方法this.getClass().getResource("/")+fileName,获取流的方法this.getClass().getResourceAsStream(failName);,屡试不爽,都行,这种没什么可注意的,大多数项目都是这种

上方便的工具类吧

import org.springframework.util.ResourceUtils;
File file= ResourceUtils.getFile("classpath:test.txt");

或者

ClassPathResource classPathResource = new ClassPathResource("test.txt");
  • 获取文件:classPathResource .getFile();
  • 获取文件流:classPathResource .getInputStream();

第二种是内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩,项目实际访问时jar包或者war包

这种最容易遇坑,最大的坑就是,用第一种方式读取,在eclipse,本地调试,完美运行,到linux环境下,就GG,

首先用获取路径的方法this.getClass().getResource("/")+fileName,获取流的方法this.getClass().getResourceAsStream(failName);在本地运行时,绝壁能找到,你打印出来路径,没错,是咱们eclipse的工作目录,项目目录,但是在target目录下。

现在给你分析为什么去到线上,就GG了,很简单,线上内嵌的工程,我们只会放一个jar文件上去,我理解是jar里面的路径是获取不到的,jar是封闭性东西吧,不像文件夹,总不能c:/home/xx.jar/file.txt,这种路径我写出来你是不是心里激起一点小浪花,别浪,稳点。

所以说到这我已经吧上帝的真理告诉你了,不要告诉别人哦,这是个秘密,好,大哥我总结一点,读取jar里面的文件,我们只能用流去读取,不能用file,文件肯定要牵扯路径,jar那个路径刚刚我已经拼出来了

jar里面文件读取方式:

ClassPathResource classPathResource = new ClassPathResource("test.txt");
  • 获取文件流:classPathResource .getInputStream();

web项目下读取classpath下文件--使用springboot遇到的大坑

在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式,都会失败,下面解释原因:

读取文件的三种方式

1. ResourceUtils工具类

import org.springframework.util.ResourceUtils;
//使用:
File file= ResourceUtils.getFile("classpath:test.txt");

2. FileInputStream文件流的方式读取

(该方式为按行读取,若不是按行处理,需要像图中将每行数据存在一个buffer中,然后转成String处理)

3. ClassPathResource获取文件流的方式

ClassPathResource classPathResource = new ClassPathResource("test.txt");
  • 获取文件:classPathResource .getFile(); 
  • 获取文件流:classPathResource .getInputStream();

不同web容器读取文件的区别

有两种常见的web容器:

1. 第一种是普通的web项目,特点是jar/war压缩包会随着容器的启动解压缩成一个文件夹,当项目访问的时候,实际是访问文件夹,而非jar或者war包。

该种方式下,用获取路径的方法:this.getClass().getResource("/")+fileName或者获取流的方法:this.getClass().getResourceAsStream(failName);都可以成功。

2. 第二种是内嵌web容器,Spring boot就是内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩,项目实际访问的就是jar/war包

该种方式最容易遇坑!!最大的坑就是,this.getClass().getResource("/")+fileName在本地windows下能完美找到路径,可是在linux测试服务器下就失败,所以读取jar中的文件只能用流读取,不能用file,即只能用方式三读取。

所以,用spring boot搭建的工程,只能用

classPathResource .getInputStream();获取文件流。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatis的mapper特殊字符转移及动态SQL条件查询小结

    mybatis的mapper特殊字符转移及动态SQL条件查询小结

    mybatis mapper文件中条件查询符,如>=,<,之类是不能直接写的会报错的需要转移一下,本文给大家介绍了常见的条件查询操作,对mybatis的mapper特殊字符及动态SQL条件查询相关知识感兴趣的朋友一起看看吧
    2021-09-09
  • Filter在springboot中的使用方法详解

    Filter在springboot中的使用方法详解

    这篇文章主要介绍了Filter在springboot中的使用方法详解,filter(过滤器)作用于在intreceptor(拦截器)之前,不像intreceptor一样依赖于springmvc框架,只需要依赖于serverlet,需要的朋友可以参考下
    2023-08-08
  • java使用MulticastSocket实现组播

    java使用MulticastSocket实现组播

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现组播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 排序算法的Java实现全攻略

    排序算法的Java实现全攻略

    这篇文章主要介绍了排序算法的Java实现,包括Collections.sort()的使用以及各种经典算法的Java代码实现方法总结,超级推荐!需要的朋友可以参考下
    2015-08-08
  • @RequestParam 接收参数的值为null的处理方式

    @RequestParam 接收参数的值为null的处理方式

    这篇文章主要介绍了@RequestParam 接收参数的值为null的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java基于JDK 1.8的LinkedList源码详析

    Java基于JDK 1.8的LinkedList源码详析

    这篇文章主要给大家介绍了关于Java基于JDK 1.8的LinkedList源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • java中常用的字符串的比较方法(两种)

    java中常用的字符串的比较方法(两种)

    本文主要介绍了java中两种常用的字符串的比较方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • java版微信和支付宝退款接口

    java版微信和支付宝退款接口

    这篇文章主要为大家详细介绍了java版微信退款接口和java版支付宝退款接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Java文件写入器FileWriter使用指南

    Java文件写入器FileWriter使用指南

    在Java中,FileWriter类用于将字符写入文件中,它继承了Writer类,因此可以使用Writer类中的所有方法,下面我们就来深入探讨一下FileWriter类的使用方法吧
    2023-10-10
  • Spring IOC和aop的原理及实例详解

    Spring IOC和aop的原理及实例详解

    这篇文章主要介绍了Spring IOC和aop的原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论