Java 中读取文件的几种方式,以及什么时候用 new File()、绝对路径或者类路径(ClassLoader)形式
1️⃣ new File() 形式(相对路径或绝对路径)
File file = new File("D:/temp/data.xlsx"); // 绝对路径 File file = new File("data/data.xlsx"); // 相对路径,相对于当前 JVM 的 working directory
特点
-
依赖文件系统路径,和程序打包方式无关
-
相对路径依赖 JVM 的工作目录(一般是启动命令所在目录)
-
绝对路径在任何地方都可以找到,只要该路径存在
适用场景
-
文件必须存在于操作系统的磁盘上
-
用户上传、日志、临时文件、外部配置文件等
-
你不能把文件打包到 jar 中再读取
注意
-
如果程序打包成 jar,jar 内部的资源无法通过
File访问 -
相对路径在不同操作系统、不同启动目录下可能找不到文件
2️⃣ ClassLoader / classpath 读取(getResourceAsStream 或 ClassPathResource)
InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/data.xlsx");
或者 Spring 风格:
Resource resource = new ClassPathResource("template/data.xlsx"); InputStream in = resource.getInputStream();
特点
-
读取 classpath 中的资源(通常在
src/main/resources) -
支持 jar 内部资源
-
返回
InputStream,不依赖物理路径
适用场景
-
模板文件(Excel、Word)
-
静态配置文件(application.properties 外的额外配置)
-
不希望依赖文件系统,打包成 jar 后依然可用
注意
-
只能读取 jar 内或者 classpath 下的资源
-
不适合写入,主要用于 读取
3️⃣ 绝对路径 vs 相对路径判断方法
| 场景 | 使用方式 | 说明 |
|---|---|---|
| 外部文件(用户上传/临时数据/服务器固定目录) | 绝对路径 (/data/file.xlsx) |
不随 jar 位置变化 |
| 开发阶段调试(本地测试) | 相对路径 (data/file.xlsx) |
工作目录不同可能路径不同 |
| 项目资源模板(Excel、配置) | ClassLoader / classpath (getResourceAsStream) |
jar 内可访问,便于打包部署 |
✅ 经验法则:
-
文件随项目打包 → classpath
-
文件独立于项目,用户可操作 → 文件系统路径
-
不确定是否打包 jar → 尽量 classpath
更多推荐
所有评论(0)