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