zoukankan      html  css  js  c++  java
  • Java NIO.2 —— 文件或目录拷贝操作

      拷贝整个文件树是可以递归每个目录和文件调用 Files.copy()方法。在使用的时候有一下注意事项。

    • 在往目录拷贝文件之前,首先要保证目录已经存在。拷贝源目录(不论是否为空)都会生成目标目录。整个任务一定在preVisitDirectory()方法中执行。
    •  visitFile()方式用来拷贝每个文件最佳的方法。
    • 在你拷贝目录或文件时,你需要决定是否要使用REPLACE_EXISTINGCOPY_ATTRIBUTES 选项。
    • 如果你想保存要拷贝的目录的属性,你需要在postVisitDirectory()方法中做此操作。
    • 如果你使用FOLLOW_LINKS选项,而在你的目录树中存在循环的链接指向父目录,这个循环将会在visitFileFailed()方法中抛出FileSystemLoopException异常。
    • 如果文件不允许访问,可以根据你自己的决定来返回FileVisitResult.CONTINUE或TERMINATE
    • 如果你指定FOLLOW_LINKS选项,则可以跟踪符号链接文件。

      下面的例子使用C: afaelnadal 目录拷贝到C: afaelnadal_copy

    import java.nio.file.FileSystemLoopException;
     import java.nio.file.attribute.FileTime;
     import java.io.IOException;
     import java.nio.file.FileVisitOption;
     import java.nio.file.FileVisitResult;
     import java.nio.file.FileVisitor;
     import java.nio.file.Files;
     import java.nio.file.Path;
     import java.nio.file.Paths;
     import java.nio.file.attribute.BasicFileAttributes;
     import java.util.EnumSet;
     import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
     import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;
     
    class CopyTree implements FileVisitor {
     
       private final Path copyFrom;
        private final Path copyTo;
     
       public CopyTree(Path copyFrom, Path copyTo) {
             this.copyFrom = copyFrom;
             this.copyTo = copyTo;
         }
     
       static void copySubTree(Path copyFrom, Path copyTo) throws IOException {
             try {
                 Files.copy(copyFrom, copyTo, REPLACE_EXISTING, COPY_ATTRIBUTES);
             } catch (IOException e) {
                 System.err.println("Unable to copy " + copyFrom + " [" + e + "]");
             }
     
        }
     
       @Override
        public FileVisitResult postVisitDirectory(Object dir, IOException exc) 
                                                                         throws IOException {
             if (exc == null) {
                 Path newdir = copyTo.resolve(copyFrom.relativize((Path) dir));
                 try {
                     FileTime time = Files.getLastModifiedTime((Path) dir);
                     Files.setLastModifiedTime(newdir, time);
                 } catch (IOException e) {
                     System.err.println("Unable to copy all attributes to: " + newdir+" ["+e+ "]");
                 }
             } else {
                 throw exc;
             }
     
            return FileVisitResult.CONTINUE;
         }
     
        @Override
         public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) 
                                                                          throws IOException {
             System.out.println("Copy directory: " + (Path) dir);
             Path newdir = copyTo.resolve(copyFrom.relativize((Path) dir));
             try {
                 Files.copy((Path) dir, newdir, REPLACE_EXISTING, COPY_ATTRIBUTES);
             } catch (IOException e) {
                 System.err.println("Unable to create " + newdir + " [" + e + "]");
                 return FileVisitResult.SKIP_SUBTREE;
             }
     
            return FileVisitResult.CONTINUE;
         }
     
        @Override
         public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) 
                                                                          throws IOException {
             System.out.println("Copy file: " + (Path) file);
             copySubTree((Path) file, copyTo.resolve(copyFrom.relativize((Path) file)));
             return FileVisitResult.CONTINUE;
         }
     
        @Override
         public FileVisitResult visitFileFailed(Object file, IOException exc) 
                                                                         throws IOException {
             if (exc instanceof FileSystemLoopException) {
                 System.err.println("Cycle was detected: " + (Path) file);
             } else {
                 System.err.println("Error occurred, unable to copy:" +(Path) file+" ["+ exc + "]");
             }
     
            return FileVisitResult.CONTINUE;
         }
     }
     
    class Main {
     
        public static void main(String[] args) throws IOException {
     
            Path copyFrom = Paths.get("C:/rafaelnadal");
             Path copyTo = Paths.get("C:/rafaelnadal_copy");
     
            CopyTree walk = new CopyTree(copyFrom, copyTo);
             EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
     
            Files.walkFileTree(copyFrom, opts, Integer.MAX_VALUE, walk);
         }
     } 
  • 相关阅读:
    养成写随笔的习惯
    脚本附加数据库
    脚本还原数据库
    C# 自定义安装包
    怕忘记了。记录一下要采购的元件1
    计划没有变化快啊
    一天三练有点累啊
    nRF24L01无线模块使用1电平转换
    好几年没参加IC公司的研讨会了
    变化
  • 原文地址:https://www.cnblogs.com/IcanFixIt/p/4919922.html
Copyright © 2011-2022 走看看