这个问题提出了一个类似的问题。但是,在我的情况下,该目录在调用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 周了。问题没有再次发生。我将假设上述答案有效。
红颜莎娜
TA贡献1842条经验 获得超12个赞
很可能这段代码被多个线程使用,因为只有这样才能解释为什么if如果条件成立,代码会进入一个块false,而且它很少发生。一个线程检查该目录不存在,并且在它可以创建它之前,另一个线程创建它。如果是这种情况,您应该使用同步。
synchronized (this) {
if (!directory.exists())
Files.createDirectories(path, attr);
}
添加回答
举报
0/150
提交
取消