主要原理是利用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; } }