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

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短文件名生成功能:

  1. 以管理员身份启动命令提示符
  2. 执行命令禁用指定盘符(此处以临时目录所在的C盘为例)的短文件名生成:
    fsutil 8dot3name set C: 1
  3. 执行命令全局禁用Windows系统的短文件名生成:
    fsutil 8dot3name set 1
  4. 重启系统后生效
    注意:该配置仅对配置生效后新建的文件/目录生效,不会修改已存在的短路径映射

验证步骤

修改完成后创建临时文件并打印目录路径,确认路径中不再出现带~的短路径片段,再执行文件读写操作验证是否还会抛出File Not Found异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 08:06:03