使用I/O流和文件对象实现目录备份功能。用户指定源目录、目标目录以及备份文件类型(如果是任意文件使用通配符*号),通过此程序可将源目录及其所有子目录下的指定类型文件保存到目标目录。
1 package com.tiger.practice; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 public class Homework5 { 7 8 public static void main(String[] args) throws IOException 9 { 10 copyDir("D:\10 cd onedrive\OneDrive - mail.cdu.edu.cn\2 大学文档\02 secondary docu\01 学科文档\15 Java", "D:\吴芝冰\Desktop"); 11 } 12 /** 13 * 使用递归复制目录, 14 * 15 * @param FromDir 16 * 源目录的路径名称 17 * @param ToDir 18 * 目的目录的路径名称 19 * @throws IOException 20 */ 21 public static void copyDir(String FromDir, String ToDir) throws IOException 22 { 23 // 创建目录的File对象 24 File srcDir = new File(FromDir); 25 // 判断源目录是不是一个目录 26 if (!srcDir.isDirectory()) 27 { 28 // 如果不是目录那就不复制 29 return; 30 } 31 // 创建目的目录的File对象 32 File destDir = new File(ToDir); 33 // 如果目的目录不存在 34 if (!destDir.exists()) 35 { 36 // 创建目的目录 37 destDir.mkdir(); 38 } 39 40 // 获取源目录下的File对象列表,每一个对象代表一个目录或者文件 41 File[] srcDirList = srcDir.listFiles(); 42 // 遍历源目录File对象列表 43 for (int i = 0; i < srcDirList.length; i++) 44 { 45 // 如果是目录的话 46 if (srcDirList[i].isDirectory()) 47 48 { 49 // 递归调用复制该目录 50 copyDir(FromDir + File.separator + srcDirList[i].getName(), 51 ToDir + File.separator + srcDirList[i].getName()); 52 } 53 // 如果是文件的话 54 if (srcDirList[i].isFile()) 55 { 56 // 调用复制文件的方法 57 copyFile(FromDir + File.separator + srcDirList[i].getName(), 58 ToDir + File.separator + srcDirList[i].getName()); 59 } 60 61 } 62 } 63 /** 64 * 复制一个文件 65 * 66 * @param srcFile 67 * 源文件 68 * @param destFile 69 * 目的文件 70 * @throws IOException 71 */ 72 public static void copyFile(String srcFile, String destFile) 73 throws IOException 74 { 75 FileInputStream in = new FileInputStream(srcFile); 76 FileOutputStream out = new FileOutputStream(destFile); 77 // 2097152(Byte)=2048(KB)=2M 78 byte[] buffer = new byte[2097152]; 79 int size = 0; 80 // 每次读取一个字节数组 81 while ((size = in.read(buffer)) != -1) 82 { 83 // 读到多少写入多少 84 out.write(buffer, 0, size); 85 } 86 in.close(); 87 out.close(); 88 } 89 90 }