JAVA :使用I/O流实现拷贝目录文件

前言

        在学习Java的I\O流的内容,有没有适合练手的有成就感的小tip呢?可以尝试以下目录文件的拷贝。另外说明,此程序的学习源于动力节点的视频教学,本人在学习后,进行了适当的修改版本。

一、问题解决思路

        对于文件路径的拷贝,我们首先要梳理思路,首先我们大体将程序分为两部分:main()、和Copydir()函数。

        在main()函数中,我们要实现哪些操作?

public static void main(String[] args) {
        //源地址
        File src = new File("D:\\myapp\\JAVA\\Learning");
        //目的地址FileCopy
        File des = new File("F:\\拷贝后");
        //拷贝目录
        Copydir(src,des, src);//第三个参数是为了后面做任意路径的拼接而准备的
    }

        在main()函数中,我们可以定义好需要复制目录的路径,这里我们是将Learning这个文件夹及其子文件路径拷贝到”F:\\拷贝后“这个文件夹下。具体实现由Copydir()递归实现。

        当然上面的路径可以自行更改!

二、Copydir函数的实现

1.获取源路径下所有子路径

代码如下(示例):将子路径返回存储到File数组中

        //获取文件所有子路径
        File[] srcson = src.listFiles();

2.并在目的路径下创建路径

代码如下(示例):

       //创建文件路径
        for(File file:srcson)
        {
            if (file.isDirectory())
            {
                System.out.println(file); //输出查看一下子路径
                //对目的路径拼接处理
                String desabsolute = des.getAbsolutePath().endsWith("\\")?des.getAbsolutePath(): des.getAbsolutePath()+"\\"+file.getAbsolutePath().substring(loadsrc.getParentFile().getAbsolutePath().length()+1);
                File desa = new File(desabsolute);//字符串变为路径
//                System.out.println("+"+desa);//查看路径是否正确
                System.out.println(loadsrc.getParentFile().getAbsolutePath().length()+1);

                if (!desa.exists())//目的路径下文件是否存在
                {
                    desa.mkdirs();//创建文件路径
                }
            }
            Copydir(file,des,loadsrc);//递归
        }
    }

3.文件路径拷贝(递归出口)

        最开始我们说是递归实现,所以在梳理好上面两部分内容后,我们就可以做最后一部分内容了,同时我们将文件拷贝作为递归出口,即当路径拿到的是一个文件的时候(文件不是文件夹。是指带后缀的那种文件)就可以进行拷贝。

//拷贝文件,递归出口
        if (src.isFile())//是文件
        {

            //进行拷贝
            FileInputStream in = null;
            FileOutputStream out = null;
            try {
                in = new FileInputStream(src);
                //拷贝的目的子路径
                String path = (des.getAbsolutePath()).endsWith("\\")?des.getAbsolutePath(): des.getAbsolutePath()+"\\"+src.getAbsolutePath().substring(loadsrc.getParentFile().getAbsolutePath().length()+1);
                File PATH = new File(path);//String路径转为File
//                System.out.println(PATH);
                out = new FileOutputStream(path);
                byte [] bytes = new byte[1024*1024];//每次1MB的速度
                int readcount = 0;
                while ((readcount = in.read(bytes))!=-1)
                {
                    out.write(bytes,0,readcount);
                }
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (in!=null)
                {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (out!=null)
                {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }

总结

总上所述,我们可以整理全部代码如下。

package com.bjpowernode.javase.IO;

import java.io.*;

public class FileCopy {
    public static void main(String[] args) {
        //源地址
        File src = new File("D:\\myapp\\JAVA\\Learning");
        //目的地址FileCopy
        File des = new File("F:\\拷贝后");
        //拷贝目录
        Copydir(src,des, src);//第三个参数是为了后面做任意路径的拼接而准备的
    }

    private static void Copydir(File src, File des,File loadsrc) {

        //拷贝文件,递归出口
        if (src.isFile())//是文件
        {

            //进行拷贝
            FileInputStream in = null;
            FileOutputStream out = null;
            try {
                in = new FileInputStream(src);
                //拷贝的目的子路径
                String path = (des.getAbsolutePath()).endsWith("\\")?des.getAbsolutePath(): des.getAbsolutePath()+"\\"+src.getAbsolutePath().substring(loadsrc.getParentFile().getAbsolutePath().length()+1);
                File PATH = new File(path);//String路径转为File
//                System.out.println(PATH);
                out = new FileOutputStream(path);
                byte [] bytes = new byte[1024*1024];//每次1MB的速度
                int readcount = 0;
                while ((readcount = in.read(bytes))!=-1)
                {
                    out.write(bytes,0,readcount);
                }
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (in!=null)
                {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (out!=null)
                {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }

        //获取文件所有子路径
        File[] srcson = src.listFiles();

        //创建文件路径
        for(File file:srcson)
        {
            if (file.isDirectory())
            {
                System.out.println(file); //输出查看一下子路径
                //对目的路径拼接处理
                String desabsolute = des.getAbsolutePath().endsWith("\\")?des.getAbsolutePath(): des.getAbsolutePath()+"\\"+file.getAbsolutePath().substring(loadsrc.getParentFile().getAbsolutePath().length()+1);
                File desa = new File(desabsolute);//字符串变为路径
//                System.out.println("+"+desa);//查看路径是否正确
                if (!desa.exists())//目的路径下文件是否存在
                {
                    desa.mkdirs();
                }
            }
            Copydir(file,des,loadsrc);
        }
    }


}

结果图:

        源路径:

         目的路径:

 

tips:如果上面代码有问题可从我的仓库自提Java学习小tip积累/IO流下的文件路径拷贝/IO流下的文件路径拷贝 · With_Zero/My_JAVA_Learning - 码云 - 开源中国 (gitee.com)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值