Java 文件读取 FileNotFoundException 但文件明明存在怎么解决?

Java 文件读取 FileNotFoundException 但文件明明存在怎么解决?

> 本文整理 Java 文件读取 FileNotFoundException 但文件明明存在怎么解决 的排查思路与可运行示例,适合课程设计、实验调试时查阅。

问题分析

文件资源管理器里能看到文件,路径也复制对了,但 FileInputStreamFileReader 仍抛出 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.txttest.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 目录");
        }
    }
}

运行说明

  1. 在项目根目录创建 test.txt,写入任意内容(如 Hello Java

  2. 编译运行:

bash 复制代码
   javac FileNotFoundDebug.java
   java FileNotFoundDebug
   
  1. 若仍报 FileNotFoundException,对照输出的「工作目录」和「绝对路径」,把文件放到程序实际查找的位置,或改用绝对路径 / 类路径资源

常见坑

  1. IDE 运行配置 :在 Run → Edit Configurations 中查看 Working directory,必要时改为项目根目录

  2. Maven/Gradle :资源文件放 src/main/resources,读取用 getClass().getClassLoader().getResourceAsStream("test.txt")

  3. 中文路径 :确保 .java 源文件保存为 UTF-8

  4. 快捷方式 :Java 不会解析 .lnk,必须指向真实文件路径

  5. 临时目录 :Linux /tmp 可能被清理,测试文件勿放临时目录

快速对照

| 现象 | 优先检查 |

|------|----------|

| IDEA 能打开,程序找不到 | 工作目录 vs 文件实际位置 |

| 相对路径失败,绝对路径成功 | 相对路径基准目录写错 |

| 仅在某台电脑失败 | 大小写、中文路径、权限 |