利用java的递归和IO将整个文件夹复制

利用java来复制文件

public static void copyFile(String oldPath ,String newPath){
        File op = new File(oldPath);
        File np = new File(newPath);
        int len = -1; 
        byte[] get =  new byte[1024];
        FileInputStream fis = null;
        FileOutputStream fos = null;
       try{
           fis = new FileInputStream(op);
           fos = new FileOutputStream(np);
           while((len=fis.read(get))!=-1){
               fos.write(get,0,len);
               //每写一次刷新一次
               fos.flush();
           }
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }finally {
           //确保最后都能关闭掉
           if(fos != null) {
               try {
                   fos.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           if(fis != null){
               try{
                   fis.close();
               }catch (IOException e){
                   e.printStackTrace();
               }
           }
       }

利用递归打印文件名称

public static void printName(String path,int deep){
        File str = new File(path);
        for(int i=0;i<deep;i++){
            System.out.print("-");
        }
        if(str.isFile()) //判断是不是文件
            System.out.println(str.getName());
        else if(str.isDirectory()){   //如果是文件夹
            for(File f:str.listFiles())   //创建一个该文件的数组
                printName(f.getPath(),deep+1); //递归打印
        }
    }

结合递归和复制,将一个文件夹内的内容复制到另一个文件夹中

关键在于得到的这个File是文件还是文件夹,如果是文件的话直接用IO流复制即可,如果是文件夹的话需要使用for循环和递归(一步一步得到该文件夹内的文件),再进行复制。

public static void copy(String oldPath,String newPath){
        try{
            (new File(newPath)).mkdirs();
            File oldFile = new File(oldPath);
            //得到原文件夹的子文件夹名称
            String[] file = oldFile.list();
            //借助数组拼接绝对位置(用于拷贝数据)
            File temp = null;
            for(int i=0;i<file.length;i++){
                //如果是以分隔符作为结尾,则不用加分隔符(separator)
                if(oldPath.endsWith(File.separator)){
                    temp = new File(oldPath+file[i]);
                } else {
                    temp = new File(oldPath+File.separator+file[i]);
                }
                //如果得到的temp是文件
                if(temp.isFile()){
                    FileInputStream fis = new FileInputStream(temp);
                    FileOutputStream fos = new FileOutputStream(newPath + "/" +  (temp.getName()).toString());
                    //一次拷贝5kb
                    byte[] b = new byte[1024*5];
                    int len = -1;
                    while((len = fis.read(b))!=-1){
                        fos.write(b,0,len);
                        fos.flush();
                    }
                    fos.close();
                    fis.close();
                }
                //如果得到的temp是文件夹
                if(temp.isDirectory()){
                    //采取递归逐层复制
                    copy(oldPath+"/"+file[i],newPath+"/"+file[i]);
                }
            }

        }catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

含main方法总代码

import java.io.*;

public class FileCopy {
    public static void main(String[] args) {
        //复制一个文件夹的内容到另一个文件夹
        String oldPath = "D:/test1";
        String newPath = "D:/test2";
        copy(oldPath,newPath);

        //复制一个文件到另一个文件(这里没有加盘符是相对路径)
        String oldFilePath = "COC.txt";
        String newFileName = "CR.txt";
        copyFile(oldFilePath,newFileName);

        //打印一个文件夹内文件的名字,传入文件路径(deep方便观看)
        printName(oldPath,0);
    }


    public static void copy(String oldPath,String newPath){
        try{
            (new File(newPath)).mkdirs();
            File oldFile = new File(oldPath);
            //得到原文件夹的子文件夹名称
            String[] file = oldFile.list();
            //借助数组拼接绝对位置(用于拷贝数据)
            File temp = null;
            for(int i=0;i<file.length;i++){
                //如果是以分隔符作为结尾,则不用加分隔符(separator)
                if(oldPath.endsWith(File.separator)){
                    temp = new File(oldPath+file[i]);
                } else {
                    temp = new File(oldPath+File.separator+file[i]);
                }
                //如果得到的temp是文件
                if(temp.isFile()){
                    FileInputStream fis = new FileInputStream(temp);
                    FileOutputStream fos = new FileOutputStream(newPath + "/" +  (temp.getName()).toString());
                    //一次拷贝5kb
                    byte[] b = new byte[1024*5];
                    int len = -1;
                    while((len = fis.read(b))!=-1){
                        fos.write(b,0,len);
                        fos.flush();
                    }
                    fos.close();
                    fis.close();
                }
                //如果得到的temp是文件夹
                if(temp.isDirectory()){
                    //采取递归逐层复制
                    copy(oldPath+"/"+file[i],newPath+"/"+file[i]);
                }
            }

        }catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void copyFile(String oldPath ,String newPath){
        File op = new File(oldPath);
        File np = new File(newPath);
        int len = -1;
        byte[] get =  new byte[1024];
        FileInputStream fis = null;
        FileOutputStream fos = null;
       try{
           fis = new FileInputStream(op);
           fos = new FileOutputStream(np);
           while((len=fis.read(get))!=-1){
               fos.write(get,0,len);
               fos.flush();
           }
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }finally {
           if(fos != null) {
               try {
                   fos.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           if(fis != null){
               try{
                   fis.close();
               }catch (IOException e){
                   e.printStackTrace();
               }
           }
       }

    }

    public static void printName(String path,int deep){
        File str = new File(path);
        for(int i=0;i<deep;i++){
            System.out.print("-");
        }
        if(str.isFile()) //是文件
            System.out.println(str.getName());
        else if(str.isDirectory()){   //是文件夹
            for(File f:str.listFiles())   //创建一个该文件的数组
                printName(f.getPath(),deep+1);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值