You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java FileReader报FileNotFoundException求助:同目录文件无法读取

排查Java FileReader读取同目录文件抛FileNotFoundException的问题

嘿,这种“之前好好的突然就找不到文件”的情况确实挺闹心的,我之前也踩过类似的坑,咱们一步步来拆解可能的原因:

1. 先确认程序的工作目录是不是你以为的那个

Java里的相对路径是基于程序运行时的工作目录,而不是你的类文件所在的目录!比如你在IDE里运行项目,工作目录大概率是项目的根目录,而不是src或者编译后的target/classes目录。

你可以在代码里加一行打印,快速确认当前工作目录:

System.out.println("当前工作目录:" + System.getProperty("user.dir"));

看看输出的路径下有没有profiles.txt——十有八九问题出在这!

解决办法:

  • 把profiles.txt移到打印出来的工作目录里;
  • 或者改用类加载器读取(后面会说,更推荐)。

2. 检查文件是否被正确复制到类文件所在目录

如果是用IDE编译项目,你放在src目录下的profiles.txt可能没被自动复制到编译后的输出目录(比如target/classes),导致类文件所在的目录里根本没有这个文件。

解决办法:

  • 在IDE里把profiles.txt标记为资源文件(比如IntelliJ里右键文件→Mark Directory as→Resources Root),这样编译时会自动复制到类文件目录;
  • 手动把profiles.txt复制到类文件所在的目录(比如bin或者target/classes)。

3. 文件名大小写的坑

Windows系统不区分文件名大小写,但Linux/macOS是严格区分的!比如你代码里写的是"profiles.txt",但实际文件名叫"Profiles.txt",在Windows上能正常读,换个系统就直接报错。

解决办法:

  • 确保代码里的文件名和实际文件名大小写完全一致,尤其是跨平台运行的场景。

4. 文件被删除/移动,或者权限不足

有时候文件可能不小心被删掉、移动到其他文件夹,或者在Linux/macOS下,当前运行程序的用户没有读取该文件的权限。

解决办法:

  • 手动去对应的路径下确认文件是否存在;
  • Linux/macOS下可以用ls -l profiles.txt查看权限,必要时用chmod +r profiles.txt添加读权限。

更可靠的替代方案:用类加载器读取同目录资源

如果你的需求就是读取和类文件同目录的文件,强烈推荐用类加载器的方式,这种方式不受工作目录影响,不管是IDE运行还是打包成Jar都能正常工作:

public static void readProfiles(BST tree) {
    try {
        // 用类加载器获取同目录的文件输入流
        InputStream inputStream = YourClassName.class.getResourceAsStream("profiles.txt");
        if (inputStream == null) {
            throw new FileNotFoundException("未找到profiles.txt文件");
        }
        BufferedReader getData = new BufferedReader(new InputStreamReader(inputStream));
        // 后续读取逻辑...
    } catch (IOException e) {
        e.printStackTrace();
    }
}

注意把YourClassName换成你的实际类名,静态方法里用类名.class,实例方法可以用this.getClass()。

内容的提问来源于stack exchange,提问作者Jonathan Woollett-light

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:44:45