Java复制目录/子目录/文件
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.List; /** * 文件拷贝 * @author lixiaolong */ public class FileTransfer { /** * 使用通道的方式进行整个目录/子目录/文件的拷贝 * @throws IOException */ public void useChannel() throws IOException { String driver = "F:\\AgileController"; String path = "/tomcat/webapps/OPMUI/customize"; File input = new File(driver + path); String bakpath = "\\syncbak"; File bakFile = new File(driver + bakpath); if(bakFile.exists()) { deleteFile(bakFile); } bakFile.mkdirs(); File output = new File(driver + bakpath + path); if(input.isDirectory()) { output.mkdirs(); List<File> allFileList = new ArrayList<File>(); getAllFiles(input, allFileList); for(File f : allFileList) { String outputPath = f.getCanonicalPath(); if(outputPath.startsWith(driver)) { outputPath = driver + bakpath + outputPath.substring(driver.length(), outputPath.length()); } output = new File(outputPath); if(f.isDirectory()) { output.mkdirs(); } else { fileCopy(f, output); } } } else { fileCopy(input, output); } } /** * 递归列出所有子目录/文件 * @param directory * @param allFileList */ private void getAllFiles(File directory, List<File> allFileList) { File flist[] = directory.listFiles(); if (flist == null || flist.length == 0) { return; } for (File f : flist) { if (f.isDirectory()) { //列出所有子文件夹 allFileList.add(f); getAllFiles(f, allFileList); } else { //列出所有文件 allFileList.add(f); } } } /** * 使用通道的方式对单个文件进行拷贝 * @param input * @param output * @throws IOException */ private void fileCopy(File input, File output) throws IOException { if(!input.exists()) { return; } if(!output.exists()) { output.createNewFile(); } FileInputStream fis = new FileInputStream(input); FileOutputStream fos = new FileOutputStream(output); FileChannel inputChannel = null; FileChannel outputChannel = null; try { inputChannel = fis.getChannel(); outputChannel = fos.getChannel(); outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); } finally { inputChannel.close(); outputChannel.close(); fis.close(); fos.close(); } } /** * 级联删除文件 * @param file */ private void deleteFile(File file) { if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { f.delete(); } } file.delete(); } public static void main(String[] args) { FileTransfer ft = new FileTransfer(); try { ft.useChannel(); } catch (IOException e) { System.out.println(e); } System.out.println("end"); } }
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
· 记一次 .NET 某发证机系统 崩溃分析
· 微服务架构学习与思考:SOA架构与微服务架构对比分析
· 历时半年,我将一个大型asp.net的零代码快速开发平台转成了java
· C#实现语音预处理:降噪、静音检测、自动增益(附Demo源码)
· 推荐五大AI+MCP自动化测试工具!
· 记一次 .NET 某无语的电商采集系统 CPU爆高分析
· Spring Boot 启动优化实践