Java创建临时目录生成短路径 访问文件抛出NotFound异常如何解决
根因说明
这个问题本质是Windows系统默认开启了8.3短文件名生成机制,Java 8/11在读取系统临时目录环境变量时,优先拿到了短路径格式的TEMP/TMP环境变量值,创建文件时直接沿用了短路径,而部分Windows 10虚拟机环境会出现短路径和长路径映射失效的情况,导致访问报错。
你之前开启的NTFS长路径策略是用于解决路径长度超过260字符无法访问的问题,和本次8.3短路径映射失效的问题无关,因此无法解决该问题。
解决方案
方案1:Java/Gradle侧强制使用长路径(推荐,无需修改系统配置)
针对你在Gradle插件中创建临时文件的场景,可直接通过代码/配置指定长路径的临时目录:
- 直接在Gradle插件代码中手动拼接长路径格式的临时目录根地址,再基于该路径创建临时目录:
import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths // 手动构造长路径格式的系统临时目录,规避短路径读取 Path tempRoot = Paths.get(System.getProperty("user.home"), "AppData", "Local", "Temp").toAbsolutePath().normalize() // 基于长路径根目录创建自定义临时目录 Path customTempDir = Files.createTempDirectory(tempRoot, "yourTempPrefix")
- 也可以在项目根目录的
gradle.properties文件中全局指定Gradle使用的临时目录,彻底规避系统短路径问题:
org.gradle.java.tmpdir=C:/Users/你的完整用户名/AppData/Local/Temp
- 如果需要通用的短路径转长路径工具方法,可以直接调用JDK的
toRealPath()方法转换已有短路径:
String shortPath = "C:/Users/FirstNam~1/AppData/Local/Temp" String longPath = new File(shortPath).toPath().toRealPath().toString()
方案2:Windows系统侧禁用8.3短文件名生成
如果需要从系统层面彻底解决该问题,可以关闭NTFS分区的8.3短文件名生成功能:
- 以管理员身份启动命令提示符
- 执行命令禁用指定盘符(此处以临时目录所在的C盘为例)的短文件名生成:
fsutil 8dot3name set C: 1 - 执行命令全局禁用Windows系统的短文件名生成:
fsutil 8dot3name set 1 - 重启系统后生效
注意:该配置仅对配置生效后新建的文件/目录生效,不会修改已存在的短路径映射
验证步骤
修改完成后创建临时文件并打印目录路径,确认路径中不再出现带~的短路径片段,再执行文件读写操作验证是否还会抛出File Not Found异常。
内容的提问来源于stack exchange,提问作者Eivyses
相关产品推荐
相关产品推荐

