Java 文件读取 FileNotFoundException 但文件明明存在怎么解决?
> 本文整理 Java 文件读取 FileNotFoundException 但文件明明存在怎么解决 的排查思路与可运行示例,适合课程设计、实验调试时查阅。
问题分析
文件资源管理器里能看到文件,路径也复制对了,但 FileInputStream 或 FileReader 仍抛出 FileNotFoundException。这在 Java 课程设计和实验里很常见,多数不是「文件不存在」,而是程序查找文件的起点(工作目录)和你想的不一样。
排查步骤
1. 验证当前工作目录(最常见)
Java 的 new File("data.txt") 从 JVM 启动时的工作目录 查找,不是 .java 文件所在目录:
java
System.out.println("当前工作目录: " + System.getProperty("user.dir"));
IntelliJ IDEA 默认工作目录一般是项目根目录;Eclipse 可能是项目根或 bin。文件若在 src/main/resources,应使用类路径资源(见示例代码)。
2. 检查路径与文件名
-
Windows 路径可用
/或\\,建议统一/ -
Linux/macOS 大小写敏感 :
Test.txt与test.txt不同 -
中文文件名:用
getAbsolutePath()打印绝对路径,到资源管理器核对
3. 权限与锁定
java
File file = new File(path);
System.out.println("存在: " + file.exists());
System.out.println("可读: " + file.canRead());
Linux/macOS 注意读权限;Windows 上文件若被其他程序独占打开,也可能读失败。
4. IDE 与构建缓存
IDEA:File → Invalidate Caches。Maven 项目资源在 src/main/resources,构建后位于 target/classes,可用 getClass().getResource() 读取。
5. 相对路径写错
例如文件在桌面,但工作目录是项目根,相对路径应为 ../Desktop/test.txt,而不是 test.txt。先 getAbsolutePath() 确认程序实际在找哪里。
示例代码
以下代码演示排查过程(Java 8+):
java
import java.io.*;
public class FileNotFoundDebug {
public static void main(String[] args) {
String fileName = "test.txt";
System.out.println("=== 调试信息 ===");
System.out.println("工作目录: " + System.getProperty("user.dir"));
File file = new File(fileName);
System.out.println("绝对路径: " + file.getAbsolutePath());
System.out.println("文件存在: " + file.exists());
System.out.println("可读: " + file.canRead());
System.out.println("是文件: " + file.isFile());
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
System.out.println("=== 文件内容 ===");
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.err.println("FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
// 备选:从类路径读取(文件放在 src/main/resources/test.txt)
System.out.println("\n=== 类路径资源 ===");
java.net.URL resource = FileNotFoundDebug.class.getResource("/test.txt");
if (resource != null) {
System.out.println("资源路径: " + resource.getPath());
} else {
System.out.println("类路径未找到 /test.txt,请把 test.txt 放到 resources 目录");
}
}
}
运行说明
-
在项目根目录创建
test.txt,写入任意内容(如Hello Java) -
编译运行:
bash
javac FileNotFoundDebug.java
java FileNotFoundDebug
- 若仍报
FileNotFoundException,对照输出的「工作目录」和「绝对路径」,把文件放到程序实际查找的位置,或改用绝对路径 / 类路径资源
常见坑
-
IDE 运行配置 :在
Run → Edit Configurations中查看 Working directory,必要时改为项目根目录 -
Maven/Gradle :资源文件放
src/main/resources,读取用getClass().getClassLoader().getResourceAsStream("test.txt") -
中文路径 :确保
.java源文件保存为 UTF-8 -
快捷方式 :Java 不会解析
.lnk,必须指向真实文件路径 -
临时目录 :Linux
/tmp可能被清理,测试文件勿放临时目录
快速对照
| 现象 | 优先检查 |
|------|----------|
| IDEA 能打开,程序找不到 | 工作目录 vs 文件实际位置 |
| 相对路径失败,绝对路径成功 | 相对路径基准目录写错 |
| 仅在某台电脑失败 | 大小写、中文路径、权限 |