`
cucaracha
  • 浏览: 137836 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A8f3fa2f-18ce-3862-897a-5d2209197c90
Java NIO.2
浏览量:85898
7a076ba7-8ec8-3241-aa3c-67bb2f7856a2
Java EE 7 简明教...
浏览量:35705
社区版块
存档分类
最新评论

[NIO.2] 第三十六篇 编写一个文件拷贝应用

阅读更多
拷贝目录树的时候,需要为文件和目录递归调用 Files.copy() 方法。在开始编写代码之前,要注意以下几点:

  • 在拷贝目录中的文件之前,必须先拷贝目录本身。不管目录中是否有文件,拷贝目录后的结果都将是空目录。这个任务必须在 preVisitDirectory() 中完成。
  • 拷贝文件最好在 visitFile() 方法中进行。
  • 在拷贝文件或目录的过程中,你要考虑是否需要使用 REPLACE_EXISTING 和 COPY_ATTRIBUTES 配置项。
  • 如果你需要保留目录的属性,那么要等到文件拷贝完成后在 postVisitDirectory() 方法中进行操作。
  • 如果你选择了使用目标文件处理软链接(FOLLOW_LINKS),并且在目录树中有循环引用,那么将会触发 visitFileFailed() 方法并抛出 FileSystemLoopException 异常。
  • 如果没有权限访问文件,那么visitFileFailed() 方法需要返回FileVisitResult.CONTINUE 或 TERMINATE,具体返回什么根据你的需求决定。
  • 在拷贝过程中,可以用 FOLLOW_LINKS 选项来用目标文件处理软链接。


下面的代码将演示将 C:\rafaelnadal 子目录树拷贝到  C:\rafaelnadal_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) 
        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:\rafaelnadal_copy 和 C:\rafaelnadal 将会有完全一样的目录树和属性。

文章来源:http://www.aptusource.org/2014/04/nio-2-writing-a-copy-files-application/
0
0
分享到:
评论

相关推荐

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    Java IO, NIO and NIO.2 原版pdf by Friesen

    New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...

    Java IO, NIO and NIO.2

    这是一本介绍java io以及nio相关知识的书,书中对知识的讲解通俗易懂,是学习java nio以及复习java io相关知识的必备书籍。注意:本书为英文版!!!

    java nio.pdf

    java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...

    Java NIO.pdf

    Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf

    Apress.Pro.Java.7.NIO.2.2011

    Apress.Pro.Java.7.NIO.2.2011

    蔚来-NIO.US-新车上市,蔚来可期.pdf

    蔚来-NIO.US-新车上市,蔚来可期.pdf

    Pro Java 7 NIO.2

    This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...

    ProJava7NIO.2PDFBooks.pdf 英文原版

    Pro Java 7 NIO.2 – PDF Books

    java NIO.zip

    java NIO.zip

    Java NIO 中英文版 + Pro Java 7 NIO.2

    Java NIO,Ron Hitchens 著,中文版 裴小星 译,Pro Java 7 NIO.2,Anghel Leonard 著,pdf文字版带书签,无安全限制

    Pro Java 7 NIO.2.pdf

    Pro Java 7 NIO.2.pdf,2011 by Anghel Leonard

    优雅的操作文件:java.nio.file 库介绍.pdf

    在早期的 Java 版本中,文件 IO 操作功能一直相对较弱,主要存在以下问题: 缺乏对现代文件系统的支持:只提供的基础的文件操作,不支持很多现代的文件系统 API 不够直观:文件操作的 API 设计相对较为复杂和冗长,...

    JavaNIO.pdf

    JavaNIO.pdf

    JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现

    下面小编就为大家分享一篇JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现,具有很好的参考价值,希望对大家有所帮助

    Pro Java 7 NIO.2 原版pdf by Leonard

    This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...

    java org.apache.http.nio jar包

    找了好久,终于找到了,java刷新同步获取网络资源

    java_nio.doc

    用java.nio.*进行网络编程

    java nio.doc

    定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。  NIO API 的集中抽象为:  缓冲区,它们是数据容器;  字符集 及其相关解码器 和编码器,  它们在字节和 Unicode 字符之间进行转换;  各种类型的通道,...

Global site tag (gtag.js) - Google Analytics