我有一个函数可以将文件从一个位置复制到另一个临时文件,然后重命名该临时文件。这是一个部署在 kubernetes pod 中的 spring-boot 应用程序。
public void copy(final Path source, final Path target) {
final Path tempDest= getTempFile(target); // Add a ".tmp" extension to target file name, so "/path/file.txt" becomes "/path/file.txt.tmp"
Files.copy(source, tempDest, StandardCopyOption.REPLACE_EXISTING);
Files.move(tempDest, target, StandardCopyOption.REPLACE_EXISTING);
}
最近我们随机遇到一个异常,上面写着
java.nio.file.NoSuchFileException: <target>
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:588)
at java.base/sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:257)
at java.base/java.nio.file.Files.copy(Files.java:1305)
at
... 130 common frames omitted
在某些情况下,我看到临时文件存在于目标位置,这意味着
Files.copy
执行没有问题。但错误来自下一行Files.move
,而在其他情况下,它会在第一行Files.copy
失败。关于为什么会发生这种情况以及我们如何解决这个问题有什么建议吗?
target
的父目录是在调用复制函数之前创建的。
当尝试访问不存在的文件时,Java 的 java.nio.file 包中的 NoSuchFileException 会被抛出。
如果文件存在或不存在,您可以使用尝试和异常,以便其余代码将运行
您可以使用此代码:-
public void copy(final Path source, final Path target) {
try {
System.out.println("Copying from " + source + " to " + target);
final Path tempDest = getTempFile(target);
System.out.println("Temp destination: " + tempDest);
Files.copy(source, tempDest, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Copy successful");
Files.move(tempDest, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Move successful");
} catch (NoSuchFileException e) {
System.err.println("NoSuchFileException: " + e.getFile());
} catch (IOException e) {
e.printStackTrace();
}
}
private Path getTempFile(Path target) {
// your code
return tempFilePath;
}
希望你喜欢我的回答..