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

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

Java NIO.2 —— 文件或目录拷贝操作的更多相关文章

  1. Java NIO.2 —— 文件或目录删除操作

    文件删除 删除单个文件的操作很简单,如果要删除一个目录树的话,需要实现FileVisitor 接口然后递归地调用delete() 或deleteIfExists()方法.在看代码之前,需要注意一下问题 ...

  2. Java NIO.2 —— 文件或目录移动操作

    移动文件树是复制和删除的文件树的结合.实际上,有两种方式来完成文件的移动.一种是使用Files.move(), Files.copy(), 和Files.delete() 这三个方法:另一种是只使用F ...

  3. 12 hdfs常用文件、目录拷贝操作、删除操作

    package com.da.hbase.tool.utils; import com.da.hbase.tool.common.Const; import org.apache.hadoop.con ...

  4. Java字节流实现文件夹的拷贝

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  5. Java中移动文件或目录的方法盘点

    本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:Java中移动文件或目录的方法盘点: import org.apache.commons.io.FileUtils; import jav ...

  6. nohup: 无法运行命令"java": 没有那个文件或目录

    问题 在一个Linux服务器上有shell 脚本如下: nohup java -jar test.jar >> ./nohup.out 2>&1 & 直接执行脚本 s ...

  7. Starting Jenkins bash: /usr/bin/java: 没有那个文件或目录

    [root@localhost /]# systemctl status jenkins.service ● jenkins.service - LSB: Jenkins Automation Ser ...

  8. jenkins启动失败 jenkins.service failed Starting Jenkins bash: /usr/bin/java: 没有那个文件或目录

    失败的原因 ● jenkins.service - LSB: Jenkins Automation Server Loaded: loaded (/etc/rc.d/init.d/jenkins; b ...

  9. Java IO和Java NIO在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

随机推荐

  1. HtmlAgilityPack 详细使用

    使用HtmlAgilityPack抓取网页数据 http://www.cnblogs.com/yxlblogs/p/3499420.html http://www.cnblogs.com/xdpxyx ...

  2. 在Ubuntu系统上搭建Hadoop 2.x(2.6.2)

    官方的中文版的Hadoop快速入门教程已经是很老的版本了,新版的Hadoop目录结构发生了变化,因此一些配置文件的位置也略微调整了,例如新版的hadoop中找不到快速入门中提到的conf目录,另外,网 ...

  3. 安装MySQL-python报错:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory或者 build\lib.win-amd64-2.7\_mysql.pyd : fatal error LNK1120: 56 unresolved externa

    解决办法1: 直接下载MySQL-python-1.2.5.win-amd64/32-py2.7.exe,点击安装 此处要注意自己安装的Python和MySQL版本是64位还是32位,否则在进行安装M ...

  4. javascript转换时间戳

    var unixTimestamp = new Date(1513814400000);commonTime = unixTimestamp.toLocaleString();

  5. SpringMVC学习笔记四:数据绑定

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6831344.html  参考:http://www.cnblogs.com/HD/p/4107674.html ...

  6. 如何在eclipse中创建.properties文件

    打开file--new--other 选择general--file--next 选择要建在哪个文件名下,然后在底部的file name后输入properities文件名,finish即可

  7. Condition Variables

    Condition Variables Condition variables are synchronization primitives that enable threads to wait u ...

  8. 【php+js】用PHP或者JS怎么显示搜索到的关键字高亮,及其文章里包含关键字的一小段

    1.想要实现的效果: 2.思路:小数据量使用 php的正则替换,即[preg_replace()]函数 -->> 支持多个关键词高亮显示,中间参数1和参数2放入对应的数组即可. $titl ...

  9. PHP-Windows下搭建PHP-MSF环境【原创】

    环境: Windows7 64位 php-7.0.19 php-swoole-1.9.15 php-yac-2.0.2 php-redis-3.1.2 php-mongodb-1.2.10 遇坑: C ...

  10. linux磁盘相关命令

    一.查看文件夹大小du du -h -d1 2>/dev/null 解释: h表示以可读性较好的方式显示,即带单位显示 d表示深度depth,为1表示只显示当前目录下文件的大小 2>/de ...