如何解析 Files.createDirectory 的 NoSuchFileException



在生产Linux env上,我正在获取NoSuchFileException for Files.createDirectory api。
我已经检查了 Files.createDirectory 的 java 文档,它本质上不会抛出此异常。
我需要知道我们在什么情况下收到Files.createDirectory API的此错误。

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)

法典

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
}

这段代码抛出FileAlreadyExistsException Files.createDirectories

  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()使用绝对路径。因此,在处理异常时要考虑到这一点。

相关内容

  • 没有找到相关文章

最新更新