惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
Y
Y Combinator Blog
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Check Point Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
博客园 - 司徒正美
I
InfoQ
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
U
Unit 42

博客园 - 如.若

Linux系统负载过高问题排查 Git 配置 ssh-key 免密登录 cron表达式详解 Spring Boot 使用 EnvironmentPostProcessor 接口实现加载外部配置文件 AdoptOpenJDK(JAVA环境)安装 JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置 JAVA 多线程基础 SQL 存储过程游标应用 SQL 语句实现查询子父节点 Spring ClassPathResource加载资源文件详解 SpringBoot+SpringSecurity+SpringSession实现一个前后端分离的权限管理系统 Spring Security 中 CSRF 防御源码解析 Redis 持久化 SpringBoot 如何防御 CSRF 攻击 SimpleDateFormat线程不安全的5种解决方案 数据库建模-规范 接口的幂等性怎么设计? TOP命令结果分析 Redis配置参数详解
浅谈web项目读取classpath路径下面的文件
如.若 · 2021-07-01 · via 博客园 - 如.若

本文主要研究的是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路径下面的文件的全部内容。