文件存在于目录中却抛出FileNotFoundException的原因排查方法
排查文件存在却抛出FileNotFoundException的实用思路
这问题我碰到过好多次,明明文件就在指定目录里,程序却硬说找不到,别急,咱们一步步拆解排查:
先揪出相对路径的坑
很多时候都是工作目录搞的鬼!你以为程序会在文件所在的目录运行,但实际可能不是——比如IDE里运行时工作目录是项目根,部署到服务器上可能是Tomcat的bin目录或者其他路径。快速验证的方法是在代码里加一行打印当前工作目录:System.out.println("当前程序工作目录: " + System.getProperty("user.dir"));把打印出来的路径和你预期的文件绝对路径对比,大概率能发现问题。
检查文件权限与访问身份
文件存在不代表当前运行程序的用户能访问它!- Linux/Unix下用
ls -l查看文件权限,确认运行程序的用户(比如Tomcat的tomcat用户)有没有读/写权限; - Windows下右键文件→属性→安全,检查运行程序的账户(比如系统服务账户)是否被授予了访问权限。
- Linux/Unix下用
核对文件名的细节
别小看拼写和大小写:- Linux系统是大小写敏感的,
Data.txt和data.txt完全是两个文件; - 有时候复制粘贴会带隐形字符(比如全角空格、换行符),肉眼根本看不出来。建议直接从文件管理器复制文件的绝对路径,和代码里的路径逐字符对比。
- Linux系统是大小写敏感的,
确认路径指向的是文件而非目录
如果代码里要操作的是文件,但你写的路径其实是一个目录,也会抛出这个异常。可以在代码里加个判断:File targetFile = new File(你的文件路径); System.out.println("路径是否为目录: " + targetFile.isDirectory());结合你的服务端代码排查
看你代码里调用了saveFile(s)方法,这里可能藏着问题:- 客户端传来的文件名有没有乱码?比如用了错误的字符编码接收,导致文件名变成无效字符;
- 拼接文件路径时有没有出错?比如少了目录分隔符,或者拼接了非法字符。建议在
saveFile方法里打印最终生成的文件路径,看看是不是符合预期。
排查文件是否被占用
虽然这种情况更多是抛出“拒绝访问”的异常,但偶尔也会表现为找不到文件。可以用Windows的资源监视器或者Linux的lsof命令,看看目标文件有没有被其他进程锁定。
另外提个小建议:尽量在代码里使用绝对路径,或者用ClassLoader.getResource()来获取资源文件,能大幅减少路径相关的问题。
内容的提问来源于stack exchange,提问作者gourav manuja
相关产品推荐
相关产品推荐

