Files.createDirectories() 抛出 FileAlreadyExists

这个问题提出了一个类似的问题。但是,在我的情况下,该目录在调用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/Live

at 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如果目录不存在,则在块中收集此信息。


小唯快跑啊
浏览 893回答 2
2回答

侃侃无极

我不能经常重现这个问题。我决定替换Files.createDirectories()为Files.createDirectory()(即根据需要在路径中创建每个目录)。也许这会奏效。也许这将阐明潜在的问题。编辑:自尝试上述操作和大约 1,000 个单元测试执行以来已经 1 周了。问题没有再次发生。我将假设上述答案有效。

红颜莎娜

很可能这段代码被多个线程使用,因为只有这样才能解释为什么if如果条件成立,代码会进入一个块false,而且它很少发生。一个线程检查该目录不存在,并且在它可以创建它之前,另一个线程创建它。如果是这种情况,您应该使用同步。synchronized (this) {&nbsp; &nbsp; if (!directory.exists())&nbsp; &nbsp; &nbsp; &nbsp; Files.createDirectories(path, attr);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java