思路:
1.定义两个静态字符串成员变量,分别关联源路径和目标路径
2.在main方法里判断源路径是否存在exists()
3.在main方法里判断目标路径是否存在exists()
如果存在删除已存在的路径,否则直接创建路径
4.遍历获取源路径下的文件和目录
如果是文件执行复制文件方法copyFile() 复制文件方法采用缓冲的字节流+字节数组实现
否则定义两个字符串变量
关联:源路径+遍历到目录的名字
目标路径+遍历到目录的名字
将两个变量再作为源目录和目标目录传入复制文件夹方法copyDirectiory()
5.复制文件夹方法会用到递归
首先还是新建目标目录
然后再获取源目录下的文件和文件夹
判断该目录下是文件还是文件夹
前者就调用copyFile()
如果是后者,则再定义两个字符串变量调用本方法递归
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 import java.io.BufferedInputStream; 5 import java.io.BufferedOutputStream; 6 import java.io.IOException; 7 8 public class TestCopy2 { 9 /** 10 *Java中实现拷贝文件夹 11 *拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用缓冲,提高读写数据的效率等。 12 *但是在拷贝文件夹时,则需要利用Flie类在目标文件夹中创建相应的目录,并且使用递归方法。 13 * 14 *用到的方法列表如下 15 *public boolean exists()测试此抽象路径名表示的文件或目录是否存在。 16 *public boolean delete()删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。 17 *public boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 18 *public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 19 *public static final String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 20 *public String getName()返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。 21 * 22 *注意:复制文件的方法和复制目录的方法中传入的内容是不同的,前者是以文件传入的,后者是以字符串传入的 23 * */ 24 25 // 源路径名 26 static String url1 = "f:/photos"; 27 // 目标路径名 28 static String url2 = "g:/tempPhotos"; 29 public static void main(String args[]) throws IOException { 30 31 // 判断源路径是否存在 32 if (!(new File(url1)).exists()) { 33 System.out.println("源文件:" + url1 + "不存在!"); 34 System.exit(0); 35 } 36 37 // 判断目标路径是否存在 38 if ((new File(url2)).exists()) { 39 // 删除已经存在的目标路径,无论目标是目录还是单个文件 40 (new File(url2)).delete(); 41 } else { 42 //如果目标路径不存在,则创建路径 43 boolean i=(new File(url2)).mkdirs(); 44 if (i==false) { 45 System.out.println("复制文件失败:创建目标文件所在目录失败"); 46 System.exit(0); 47 } 48 } 49 // 获取源文件夹当前下的文件或目录 50 File[] file = (new File(url1)).listFiles(); 51 for (int i = 0; i < file.length; i++) { 52 if (file[i].isFile()) { 53 // 复制文件 54 copyFile(file[i],new File(url2+File.separator+file[i].getName())); 55 }else 56 if (file[i].isDirectory()) { 57 // 复制目录 58 String sourceDir=url1+File.separator+file[i].getName(); 59 String targetDir=url2+File.separator+file[i].getName(); 60 copyDirectiory(sourceDir, targetDir); 61 } 62 } 63 } 64 65 //复制文件 66 public static void copyFile(File sourceFile,File targetFile)throws IOException{ 67 // 新建文件输入流并对它进行缓冲 68 FileInputStream input = new FileInputStream(sourceFile); 69 BufferedInputStream inBuff=new BufferedInputStream(input); 70 71 // 新建文件输出流并对它进行缓冲 72 FileOutputStream output = new FileOutputStream(targetFile); 73 BufferedOutputStream outBuff=new BufferedOutputStream(output); 74 75 // 缓冲数组 76 byte[] b = new byte[1024 * 5]; 77 int len; 78 while ((len =inBuff.read(b)) != -1) { 79 outBuff.write(b, 0, len); 80 } 81 // 刷新此缓冲的输出流 82 outBuff.flush(); 83 84 //关闭流 85 inBuff.close(); 86 outBuff.close(); 87 output.close(); 88 input.close(); 89 } 90 91 // 复制文件夹 92 /** 93 * 下面方法用到递归方法, 94 * 首先创建该目录 95 * 判断该目录下是文件还是目录,如果是文件,则调用函数copyFile(File sourceFile,File targetFile)进行复制 96 * 如果是目录,则调用copyDirectiory(dir1, dir2),程序再次回到copyDirectiory() 97 * 创建子目录,然后进行判断。 98 * 如果是空目录,那么(new File(sourceDir)).listFiles()获得的是0,不进行for循环,退出该函数 99 * 100 * */ 101 public static void copyDirectiory(String sourceDir, String targetDir)throws IOException { 102 // 新建目标目录 103 (new File(targetDir)).mkdirs(); 104 // 获取源文件夹当前下的文件或目录 105 File[] file = (new File(sourceDir)).listFiles(); 106 for (int i = 0; i < file.length; i++) { 107 if (file[i].isFile()) { 108 // 源文件 109 File sourceFile=file[i]; 110 // 目标文件 111 File targetFile= 112 new File((new File(targetDir)).getAbsolutePath()+File.separator+file[i].getName()); 113 copyFile(sourceFile,targetFile); 114 } else 115 if (file[i].isDirectory()) { 116 // 准备复制的源文件夹 117 String dir1=sourceDir + File.separator + file[i].getName(); 118 // 准备复制的目标文件夹 119 String dir2=targetDir + File.separator+ file[i].getName(); 120 copyDirectiory(dir1, dir2); 121 } 122 } 123 } 124 }