用例结束删临时目录,Windows 报 DirectoryNotEmptyException。文件看着已经处理完,进程退出后目录才消失。乍看像缓存或者权限的锅,追下去往往不是。

try (InputStream in = Files.newInputStream(path)) {
    // read
}
Files.deleteIfExists(tempDir);

追下去是这么回事:newInputStream 拿到的流没有关,JVM 还持有文件句柄。Windows 不允许删除被打开的文件,Linux 上同样的代码却能过。

「Windows 临时目录」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

具体做法是,所有流用 try-with-resources 包起来 确保 close 被调用;删目录前先逐个删文件 并捕获单条失败;用 handle 工具查出是谁占着;CI 同时跑 Linux 和 Windows 两个 job。

验收就看一点,用例结束后临时目录立即消失 不再需要等进程退出。

作者 9823189