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
相关产品推荐
相关产品推荐

