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

[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

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    java NIO.zip

    通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...

    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 ...

    Pro Java 7 NIO.2.pdf

    根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...

    NIO.2 入门,第 2 部分: 文件系统 API

    在Java的NIO.2(New IO 2.0)框架中,文件系统API提供了更加高效和灵活的方式来处理文件和目录。本篇我们将深入探讨NIO.2中的几个关键概念和类,包括`Files`, `Path`, `FileAttributes`, `DirectoryWatcher`以及`...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    这个文件很可能是一个示例程序,演示了如何使用Java NIO进行高效的大文件复制。在传统的Java I/O中,我们通常使用InputStream和OutputStream进行文件复制,而这种方式需要不断读写,造成大量的上下文切换,效率较低...

    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.nio.file 库介绍.pdf

    - **WatchService**:这是一个观察者模式的实现,允许应用程序监听文件系统事件,如文件创建、修改或删除。通过注册`Path`到`WatchService`,可以接收这些事件的通知。 - **PathMatcher**:这个工具类允许你创建一...

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

    JDK1.7 之 java.nio.file.Files 读取文件仅需一行代码实现,提供了一个简洁高效的读取文件方式,适合小型文件的读取。但是,对于大文件,需要使用其他读取方法,以避免内存溢出异常。 知识点: 1. java.nio.file....

    Java I/O, NIO and NIO.2

    在实际应用中,Java I/O适用于简单的文件读写和网络通信,而NIO和NIO.2更适合于需要高并发和低延迟的场景,如服务器开发。理解并熟练掌握这些技术,可以帮助开发者构建出更高效、更稳定的系统。 总的来说,Java I/O...

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

    `Pro Java 7 NIO.2`这本书由Anghel Leonard著,深入探讨了Java NIO.2 API,这是Java 7引入的进一步扩展,包括: 1. **文件系统API增强**:新增了AsynchronousFileChannel,支持异步文件操作,可以在后台线程中执行...

    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 ...

    Apress.Pro.Java.7.NIO.2.2011

    《Apress.Pro.Java.7.NIO.2.2011》这本书专注于讲解Java 7中的非阻塞I/O(Non-blocking I/O, NIO)和NIO 2的高级特性,是Java开发者深入理解这一关键领域的重要参考资料。NIO在Java平台中扮演着至关重要的角色,特别...

    nio.zip_NIO_NewIO_NIO.c_java NIO chm_java nio

    NIO(New IO)是Java平台中用于处理输入/输出...`nio.zip`这个压缩包包含了有关NIO的CHM文档,对于深入理解和运用Java NIO技术,这是一个非常有价值的资源。建议读者下载并仔细研究,以便更好地利用NIO提升程序性能。

    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

Global site tag (gtag.js) - Google Analytics