码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-23 20:18:51      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   java   os   使用   io   文件   for   

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

思路和步骤: 对于文件夹的复制,分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流对文件夹的复制(文件夹中带有子目录)

标签:style   blog   color   java   os   使用   io   文件   for   

原文地址:http://www.cnblogs.com/driverwjd/p/3931638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!