Files.exists()检测常规文件返回false、目录返回true的原因
问题原因分析
可能原因1:Windows文件扩展名隐藏导致实际文件名不符
Windows默认会隐藏已知文件类型的扩展名,当你在资源管理器中创建“test.txt”文件时,系统可能自动将其命名为test.txt.txt,但你看到的显示名称是“test.txt”。此时代码中查找的是\\examples\\test.txt,实际对应的文件并不存在,所以Files.exists()返回false。
而创建目录时,目录名称不会被自动添加扩展名,你创建的“test.txt”目录就是真实的test.txt,与代码中的路径匹配,因此Files.exists()返回true。
可能原因2:路径解析的歧义(绝对路径 vs 相对路径)
你使用的路径\\examples\\test.txt在Windows系统中会被解析为当前驱动器根目录下的绝对路径(比如C:\examples\test.txt),而非当前工作目录下的相对路径。
如果你的当前工作目录不是C盘根目录(比如是C:\Users\YourName),那么你实际创建的文件是在C:\Users\YourName\examples\test.txt,但代码查找的是C:\examples\test.txt,自然找不到该文件,返回false。
而如果之后你误在C盘根目录下的examples中创建了test.txt目录,或者系统环境有其他变化导致路径匹配,就会返回true。
验证与解决方法
- 检查真实文件名:在资源管理器中开启“显示文件扩展名”选项,查看
examples目录下的文件实际名称是否为test.txt。 - 使用相对路径:将代码中的路径改为
examples/test.txt(或examples\\test.txt),这样会基于当前工作目录查找,避免绝对路径的歧义。 - 打印解析后的路径:在代码中添加
System.out.println(Path.of("\\examples\\test.txt").toAbsolutePath());,查看实际解析后的路径是否与你创建文件的路径一致。
内容的提问来源于stack exchange,提问作者Mohammed Lilo
相关产品推荐
相关产品推荐

