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

文件存在于目录中却抛出FileNotFoundException的原因排查方法

排查文件存在却抛出FileNotFoundException的实用思路

这问题我碰到过好多次,明明文件就在指定目录里,程序却硬说找不到,别急,咱们一步步拆解排查:

  • 先揪出相对路径的坑
    很多时候都是工作目录搞的鬼!你以为程序会在文件所在的目录运行,但实际可能不是——比如IDE里运行时工作目录是项目根,部署到服务器上可能是Tomcat的bin目录或者其他路径。快速验证的方法是在代码里加一行打印当前工作目录:

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

    把打印出来的路径和你预期的文件绝对路径对比,大概率能发现问题。

  • 检查文件权限与访问身份
    文件存在不代表当前运行程序的用户能访问它!

    • Linux/Unix下用ls -l查看文件权限,确认运行程序的用户(比如Tomcat的tomcat用户)有没有读/写权限;
    • Windows下右键文件→属性→安全,检查运行程序的账户(比如系统服务账户)是否被授予了访问权限。
  • 核对文件名的细节
    别小看拼写和大小写:

    • Linux系统是大小写敏感的,Data.txt和data.txt完全是两个文件;
    • 有时候复制粘贴会带隐形字符(比如全角空格、换行符),肉眼根本看不出来。建议直接从文件管理器复制文件的绝对路径,和代码里的路径逐字符对比。
  • 确认路径指向的是文件而非目录
    如果代码里要操作的是文件,但你写的路径其实是一个目录,也会抛出这个异常。可以在代码里加个判断:

    File targetFile = new File(你的文件路径);
    System.out.println("路径是否为目录: " + targetFile.isDirectory());
    
  • 结合你的服务端代码排查
    看你代码里调用了saveFile(s)方法,这里可能藏着问题:

    • 客户端传来的文件名有没有乱码?比如用了错误的字符编码接收,导致文件名变成无效字符;
    • 拼接文件路径时有没有出错?比如少了目录分隔符,或者拼接了非法字符。建议在saveFile方法里打印最终生成的文件路径,看看是不是符合预期。
  • 排查文件是否被占用
    虽然这种情况更多是抛出“拒绝访问”的异常,但偶尔也会表现为找不到文件。可以用Windows的资源监视器或者Linux的lsof命令,看看目标文件有没有被其他进程锁定。

另外提个小建议:尽量在代码里使用绝对路径,或者用ClassLoader.getResource()来获取资源文件,能大幅减少路径相关的问题。

内容的提问来源于stack exchange,提问作者gourav manuja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:06:59