为了账号安全,请及时绑定邮箱和手机立即绑定

Files.createDirectories() 抛出 FileAlreadyExists

Files.createDirectories() 抛出 FileAlreadyExists

小唯快跑啊 2021-12-30 16:16:43
这个问题提出了一个类似的问题。但是,在我的情况下,该目录在调用Files.createDirectories(). 这发生在 Oracle JDK 10.0.2 上。这是我的代码...Set<PosixFilePermission> perms;FileAttribute<?> attr;Path path;File directory;directory = new File("/test/http/localhost_4452/UCF2b/Live");path      = directory.toPath();perms     = EnumSet.noneOf(PosixFilePermission.class);perms.add(PosixFilePermission.OWNER_READ);perms.add(PosixFilePermission.OWNER_WRITE);perms.add(PosixFilePermission.OWNER_EXECUTE);attr = PosixFilePermissions.asFileAttribute(perms);try{   if (!directory.exists())      Files.createDirectories(path, attr);}catch (IOException e){   if (!directory.exists())   {      ... collect more information about the state of the directory and its parent path ...      ... add this information as a suppressed exception ...      throw e;   }   // else do nothing and assume another thread created the directory}这里是例外...java.nio.file.FileAlreadyExistsException: /test/http/localhost_4452/UCF2b/Liveat java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:94)at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:385)at java.base/java.nio.file.Files.createDirectory(Files.java:682)at java.base/java.nio.file.Files.createAndCheckIsDirectory(Files.java:789)at java.base/java.nio.file.Files.createDirectories(Files.java:735)at ...my code...当前用户是root。这是收集到的有关目录及其父目录的诊断信息。catch如果目录不存在,则在块中收集此信息。
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

我不能经常重现这个问题。我决定替换Files.createDirectories()Files.createDirectory()(即根据需要在路径中创建每个目录)。也许这会奏效。也许这将阐明潜在的问题。

编辑:自尝试上述操作和大约 1,000 个单元测试执行以来已经 1 周了。问题没有再次发生。我将假设上述答案有效。


查看完整回答
反对 回复 2021-12-30
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

很可能这段代码被多个线程使用,因为只有这样才能解释为什么if如果条件成立,代码会进入一个块false,而且它很少发生。一个线程检查该目录不存在,并且在它可以创建它之前,另一个线程创建它。如果是这种情况,您应该使用同步。


synchronized (this) {

    if (!directory.exists())

        Files.createDirectories(path, attr);

}


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 892 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信