java如何复制文件夹
使用 Java NIO 的 Files.walkFileTree 方法
Java NIO(New I/O)提供了 Files.walkFileTree 方法,可以递归遍历文件夹并复制所有文件和子文件夹。以下是示例代码:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class FolderCopy {
public static void copyFolder(Path source, Path target) throws IOException {
Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path targetDir = target.resolve(source.relativize(dir));
Files.createDirectories(targetDir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.copy(file, target.resolve(source.relativize(file)), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
});
}
}
使用 Apache Commons IO 库
Apache Commons IO 提供了 FileUtils.copyDirectory 方法,可以简化文件夹复制操作:
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class FolderCopy {
public static void copyFolder(File source, File target) throws IOException {
FileUtils.copyDirectory(source, target);
}
}
使用 Java 7+ 的 Files.copy 方法
对于简单情况,可以使用 Files.copy 方法结合递归:
import java.io.IOException;
import java.nio.file.*;
public class FolderCopy {
public static void copyFolder(Path source, Path target) throws IOException {
if (Files.isDirectory(source)) {
Files.createDirectories(target);
try (DirectoryStream<Path> stream = Files.newDirectoryStream(source)) {
for (Path entry : stream) {
copyFolder(entry, target.resolve(entry.getFileName()));
}
}
} else {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
}
}
}
注意事项
- 复制前应检查目标文件夹是否存在,避免覆盖重要文件
- 处理大文件时考虑使用缓冲区提高性能
- 注意文件权限和属性的保留
- 考虑添加异常处理机制,特别是处理文件权限问题时
以上方法各有优缺点,NIO 方法更现代且功能强大,Apache Commons IO 方法最简单,而递归 Files.copy 方法不需要额外依赖。根据项目需求选择最适合的方法。







