主要原理是利用jdk1.7的Files.walkFileTree遍历文件树,再在里面用Files.copy即可实现高性能jdk new io文件拷贝.
可以参考如下代码:
/**
* 拷贝标准工程
*
* @param source 源路径
* @param target 目标路径
* @throws IOException IO异常
*/
private void doCopyProject(Path source, Path target) throws IOException {
// 拷贝文件夹目录
Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new CopyDirectoryVisitor(source, target));
}
package xxx
import java.io.IOException;
import java.nio.file.AccessDeniedException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 文件夹复制
*
* @author 许畅
* @since JDK1.7
* @version 2017年10月13日 许畅 新建
*/
public class CopyDirectoryVisitor extends SimpleFileVisitor<Path> {
/** 日志 */
private static final Logger LOGGER = LoggerFactory.getLogger(CopyDirectoryVisitor.class);
/** 源文件 */
private Path source;
/** 目标文件 */
private Path target;
/**
* 构造方法
*
* @param source 源文件
* @param target 目标文件
*/
public CopyDirectoryVisitor(Path source, Path target) {
this.source = source;
this.target = target;
}
/**
* 访问文件
*
* @param file 文件路径
* @param attributes 属性
* @return FileVisitResult
* @throws IOException IO异常
*/
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException {
LOGGER.info("Copying " + source.relativize(file));
Files.copy(file, target.resolve(source.relativize(file)), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path directory, BasicFileAttributes attributes) throws IOException {
Path targetDirectory = target.resolve(source.relativize(directory));
try {
LOGGER.info("Copying " + source.relativize(directory));
Files.copy(directory, targetDirectory, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
if (!Files.isDirectory(targetDirectory)) {
throw e;
}
} catch (DirectoryNotEmptyException e) {
// ignore
} catch (AccessDeniedException e) {
// ignore
}
return FileVisitResult.CONTINUE;
}
}