使用java.nio包复制到现有的目标文件/目录集会导致java.nio.file.FileAlreadyExistsException

时间:2017-07-10 04:40:03

标签: java io nio

我正在尝试使用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 。此外,如果文件已经存在,那么我需要替换它,否则复制文件。 请指教我。

2 个答案:

答案 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)将完全按照您的需要进行操作。