当我们要复制带有子目录的文件夹的时候,就必须使用递归,这样才能把全部的文件夹都复制到位
思路和步骤: 对于文件夹的复制,分2种情况
(1)当我们对文件进行遍历的时候,如果目标文件夹下的文件是个标准文件的话,我们就可以直接去做复制的动作,
(2)当目标文件中,是带有文件夹的文件,那么这个时候就需要对文件夹进行递归,直到最后它是个标准文件后,我们在做复制动作
有了上述的2种情况后,那么这个需求,需要提供2种方法,1是对标准文件的复制,2是对带有文件夹的文件进行复制的操作
第一种,是标准的字节复制动作,很容易实现.
对于第二种,带有文件夹的文件进行复制的方法的时候,由于文件夹下面可能还是个文件夹,那个这个时候就需要使用到递归,对文件夹复制的时候,进行判断,是标准文件的话,直接用字节流复制的动作对它复制,如果它还是带着目录的话,我们就使用递归自己调用自己的方法,知道最后是标准文件,这时候在出栈,去进行字节的复制
具体代码如下:
package wjd.copy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyFile { public static void main(String[] args) throws IOException { //需要被复制文件夹的位置 String url1 = "c:" + File.separator + "source"; //最后被复制的文件夹 String url2 = "d:" + File.separator + "copy"; //将这2个文件夹包装成File对象 File file1 = new File(url1); File file2 = new File(url2); //创建目标文件夹 file2.mkdirs(); //对源文件夹进行遍历 File[] files = file1.listFiles(); for (int a = 0; a < files.length; a++) { //是标准文件,我们就直接进行复制动作 if (files[a].isFile()) { //确认目标文件的需要被复制到的位置,它肯定是在目标文件夹下面 File target = new File(file2, files[a].getName()); copyFile(files[a], target); } if(files[a].isDirectory()){ //文件夹下面还是个文件夹,这个时候去拿到文件夹的路径 String source1 = url1+File.separator+files[a].getName(); String target1 = url2+File.separator+files[a].getName(); copyDir(source1,target1); } } } private static void copyDir(String source1, String target1) throws IOException { File source = new File(source1); File target = new File(target1); target.mkdirs(); File[] files = source.listFiles(); for(int a=0;a<files.length;a++){ if(files[a].isFile()){ File target2 = new File(target,files[a].getName()); copyFile(files[a], target2); } if(files[a].isDirectory()){ String source3 = source1 +File.separator + files[a].getName(); String target3 = target1 +File.separator + files[a].getName(); //递归,对还是文件夹的文件夹在调用copyDir的方法,上面的if条件是递归的出口 copyDir(source3,target3); } } } private static void copyFile(File file, File target) throws IOException { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(target)); byte[] buf = new byte[1024]; int len = 0; while((len=bis.read(buf))!= -1){ bos.write(buf, 0,len); } bis.close(); bos.close(); } }