我正在尝试使用Java NIO API将一个文件复制到另一个位置。当我在代码下面运行时,我得到java.nio.file.FileAlreadyExistsException
。
public static void copyFileUsingNio(File sourceFile, String destnationFilePath) {
try {
if (sourceFile != null && destnationFilePath != null) {
java.nio.file.Path sourcePath = sourceFile.toPath();
java.nio.file.Path destinationPath = java.nio.file.Paths.get(destnationFilePath);
if (!java.nio.file.Files.exists(destinationPath)) {
java.nio.file.Path parent = destinationPath.getParent();
if (parent != null) {
java.nio.file.Files.createDirectories(destinationPath.getParent());
java.nio.file.Files.createFile(destinationPath);
}
destinationPath = java.nio.file.Files.copy(sourcePath, destinationPath);
} else {
destinationPath = java.nio.file.Files.copy(
sourcePath, destinationPath,
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
StackTrace:
java.nio.file.FileAlreadyExistsException: C:\ Users \用户旅客\桌面\文件\ desttest.txt
at sun.nio.fs.WindowsFileCopy.copy(未知来源) at sun.nio.fs.WindowsFileSystemProvider.copy(Unknown Source) at java.nio.file.Files.copy(Unknown Source) 在com.filetest.copyFileUsingNio(TestFile.java:110)
此处destnationFilePath
是 C:/Users/guest/Desktop/Files/desttest.txt 。此外,如果文件已经存在,那么我需要替换它,否则复制文件。
请指教我。
答案 0 :(得分:3)
if (!java.nio.file.Files.exists(destinationPath)) {
java.nio.file.Path parent = destinationPath.getParent();
if (parent != null) {
java.nio.file.Files.createDirectories(destinationPath.getParent());
java.nio.file.Files.createFile(destinationPath);
}
destinationPath = java.nio.file.Files.copy(sourcePath, destinationPath);
} else {
destinationPath = java.nio.file.Files.copy(sourcePath, destinationPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
您不需要exists()
来电或createFile()
来电,也不需要对copy()
进行替代调用。
Path parent = destinationPath.getParent();
if (parent != null && !Files.exists(parent)) {
Files.createDirectories(parent);
}
destinationPath = Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
答案 1 :(得分:0)
正如Andreas所说,没有必要调用.createFile()
- copy()
操作将为您创建目标文件,作为复制它的一部分。
正如.copy()
文档所述:
默认情况下,如果目标文件已存在,则复制失败
这是导致FileAlreadyExistsException
失败的原因。
但是如果你在copy()
时使用正确的选项,你甚至根本不需要存在检查 - 因为文档说明StandardCopyOption.REPLACE_EXISTING
表示应该覆盖现有的目标文件,而不是而不是导致操作失败。
基本上,您唯一需要做的就是确保父目录存在(正如您所做的那样Files.createDirectories()
),然后copy(source, destination, REPLACE_EXISTING)
将完全按照您的需要进行操作。