首页 > 代码库 > 使用IO流对文件夹的复制(文件夹中带有子目录)

使用IO流对文件夹的复制(文件夹中带有子目录)

当我们要复制带有子目录的文件夹的时候,就必须使用递归,这样才能把全部的文件夹都复制到位

思路和步骤: 对于文件夹的复制,分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();    }}

使用IO流对文件夹的复制(文件夹中带有子目录)