如何解决Files.createDirectories的NoSuchFileException问题

3
在一个生产Linux环境中,我使用Files.createDirectories API时得到了NoSuchFileException异常。我已经核查了Files.createDirectories的Java文档,它本质上不会抛出此异常。我需要知道在什么情况下会为Files.createDirectories API获取此错误。 "Original Answer"翻译成"最初的回答"。
stackTrace
-----------
java.nio.file.NoSuchFileException: /folder1/folder2/folder abc/ABC-UVW XYZ
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
    at java.nio.file.Files.createDirectory(Files.java:674)
    at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
    at java.nio.file.Files.createDirectories(Files.java:767)

Code

if(!file.getParentFile().exists()) {
    Files.createDirectories(Paths.get(file.getParent()));
    //Files.createDirectories() should create all non existent parent directories but instead it throws NoSuchFileException.
    //......other code
}

1
请澄清一下,空格是否允许? - Mansur
@MensurQulami 是的 - bhavesh patidar
1
你想要创建的文件夹中是否有任何一个已经存在于普通文件而非目录中?我找到了这个错误报告:https://bugs.openjdk.java.net/browse/JDK-7030716 - Amongalen
从代码审查来看,我不认为是这种情况。由于这是生产环境,我无法验证这一点。 - bhavesh patidar
你的Java应用程序是否在Docker容器中运行? - sedovav
是的,Java应用程序在容器内运行。 - bhavesh patidar
1个回答

0
这段代码在使用Files.createDirectories时会抛出FileAlreadyExistsException异常:
  public static void main(String[] args) throws IOException {
    Files.createDirectories(Path.of("A/B"));
    Files.createFile(Path.of("A/B/C"));

    // throws FileAlreadyExistsException("A/B/C")
    Files.createDirectories(Path.of("A/B/C"));
  }

根据javadoc的预期行为,因为已经存在同名文件(C),所以未能创建目录。
您可以通过删除由FileSystemException.getFile()提供的文件并再次尝试Files.createDirectories来处理它。

然而 - 这段代码会抛出 NoSuchFileException 异常:

  public static void main(String[] args) throws IOException {
    Files.createDirectories(Path.of("A/B"));
    Files.createFile(Path.of("A/B/C"));

    // throws NoSuchFileException("A/B/C/D")
    Files.createDirectories(Path.of("A/B/C/D/E"));
  }

由于 D 的父级是一个文件。

您可以通过删除 getFile() 提供的文件的父级并再次尝试 Files.createDirectories 来类似地处理它。

这很奇怪,因为在 javadoc 中没有解释。我会期望与第一个例子相同的 FileAlreadyExistsException


还有一个异常之间的不一致性; FileAlreadyExistsException.getFile() 使用相对路径,而NoSuchFileException.getFile()使用绝对路径。因此,在处理这些异常时要考虑到这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接