java 如何解决文件的NoSuchFileException,createDirectories

f45qwnt8  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(239)

在生产Linux环境中,我收到Files.createDirectoriesapi的NoSuchFileException
我已经检查了java文档中的Files.createDirectories,它本质上不会抛出此异常。
我需要知道在什么情况下我们会得到Files.createDirectoriesAPI的此错误。

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
}
hvvq6cgz

hvvq6cgz1#

下面的代码抛出了FileAlreadyExistsExceptionFiles.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()使用绝对路径。所以在处理异常时要考虑到这一点。

相关问题