浅谈web项目读取classpath路径下面的文件
本文主要研究的是web项目下读取classpath路径下的文件的问题,具体如下:
首先分两大类,按web容器分类:
第一种是普通的web项目,像用Tomcat容器,特点是压缩包随着容器的启动会解压缩成一个文件夹,项目访问的时候,实际是去访问文件夹,而不是jar或者war包,这种的无论你是使用
//获取路径 this.getClass().getResource("/") + fileName //Spring ResourceUtils import org.springframework.util.ResourceUtils; File file= ResourceUtils.getFile("classpath:resource/test.txt");
或者
Resource res = new ClassPathResource("template/test.txt"); //获取文件: classPathResource.getFile(); //获取文件流: classPathResource.getInputStream();
第二种是内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩,项目实际访问时jar包或者war包,这种最容易遇坑,最大的坑就是,用第一种方式读取,在eclipse,本地调试,完美运行,到linux环境下,就不行.
首先用获取路径的方法
this.getClass().getResource("/")+fileName
获取流的方法
this.getClass().getResourceAsStream(failName) this.getClass().getClassLoader().getResourceAsStream(failName)
在本地运行时,绝对能找到,打印出来的路径,没错,是我们eclipse的工作目录,项目目录,但是在target目录下。
现在我们分析为什么去到线上就GG了,很简单,线上内嵌的工程,我们只会放一个jar文件上去,因为jar里面的路径是获取不到的,jar是封闭性东西,不像文件夹,总不能是 C:/home/xx.jar/file.txt。读取jar里面的文件,我们只能用流去读取,不能用file,文件肯定要牵扯路径,jar那个路径刚刚我已经拼出来了。
jar包里面文件读取方式:
import org.springframework.core.io.ClassPathResource; ClassPathResource classPathResource = new ClassPathResource("template/test.txt") //获取文件流 classPathResource.getInputStream();
实际读取路径如下
sun.net.www.protocol.jar.JarURLConnection:jar:file:/opt/temp/test-app/test.jar!/template/test.txt
总结
以上就是本文关于浅谈web项目读取classpath路径下面的文件的全部内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2019-07-01 使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空
2019-07-01 CSRF 攻击的应对之道
2016-07-01 DatabaseFactory.CreateDatabase 方法操作数据库