zoukankan      html  css  js  c++  java
  • 使用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();
        }
    }
  • 相关阅读:
    mysql表检查分析优化
    mysql表存储
    mysql表空间文件
    mysql回滚日志
    mysql重做日志
    mysql二进制日志
    最佳高质量字体
    mysql存储引擎
    如何提取app软件的apk格式中的字体?
    tar split命令
  • 原文地址:https://www.cnblogs.com/driverwjd/p/3931638.html
Copyright © 2011-2022 走看看