IO流实现文件夹的拷贝(ArrayList底层实现)


🍜使用IO流编写文件夹拷贝功能

  • 使用到字节流FileInputStream、FileOutputStream、BufferedFileInputStream/BufferedFileOutputStream,以及常用方法
1、首先通过用户输入要拷贝文件夹目录
  • file01是要拷贝的文件夹路径
  • file02是要拷贝目标目录路径
  • dir():方法用于用户对路径的输入处理
//main方法
 public static void main(String[] args) throws IOException {
        File file01=dir();
        File file02=dir();//此处调用dir()方法
        //判断两个路径是不是一个路径
        if(file01.equals(file02)){
            System.out.println("源目录与目的目录属于一个目录!");
            // throw new IllegalArgumentException("源目录与目的目录属于一个目录!");
        }else{
            copy(file02,file01);
        }
    }
//dir()方法:处理用户对路径的输入
 private static File dir() throws FileNotFoundException{
        System.out.println("请输入路径:");
        File dir=new File(new Scanner(System.in).next());
        //对路径的判断
        while(true){
            if(!dir.exists()){
                System.out.println("路径不存在!");
                //throw new FileNotFoundException("FileNotFound");
            }else if(dir.isFile()){
                System.out.println("请输入文件路径!");
                //throw new FileNotFoundException("FileNotFound");
            }else{
                return dir;
            }
        }
    }
 }


2、核心文件的读写拷贝,文件夹的处理
  • 使用到递归实现多层目录的拷贝
 private static void copy(File file02, File file01) throws IOException {
        File toDir=new File(file02,file01.getName());//拼接成目的目录
        //判断目的目录是否已经纯在,存在则创建
        if(!(toDir.exists())){
            toDir.mkdirs();
        }
        File[] file=file01.listFiles();//获取原文件的全部文件到数组中
        for (File f: file) {
            if(f.isFile()){//判断是否是普通文件
                InputStream input=new BufferedInputStream(new FileInputStream(f));
                OutputStream output=new BufferedOutputStream(new FileOutputStream(new File(toDir,f.getName())));
                int len;
                while((len=input.read())!=-1){
                    output.write(len);
                }
                output.flush();
                output.close();
                input.close();
            } else{
                copy(toDir,f);//递归,内部文件夹则递归处理再来一遍
            }
        }
    }

测试:

  • 准备了file01文件夹和file02文件夹

在这里插入图片描述

  • 运行测试

在这里插入图片描述

最终结果:
在这里插入图片描述

成功!完结撒花!(上面的对路径的判断处理可以优化成异常处理)



补充:ArrayList模仿编写

public class ArrayLists {
    public static void main(String[] args) {
        ArraysList as=new ArraysList();
        as.add("abc");
        as.add("dd");
        as.add("dd");
        as.remove(2);
       as.remove(5);
    }
}

class ArraysList{
    private String[] elementData;

    public ArraysList() {
    }

    public int getSize() {
        return size;
    }

    private int size;
//添加元素
    public void add(String data){
        //获取原数组
        String[] ele=elementData;
        //将原数组的指引指向新数组
        elementData=new String[size+1];
        for (int i = 0; i < size; i++) {
            elementData[i]=ele[i];
        }
        //添加
        elementData[size++]=data;
        System.out.println(Arrays.toString(elementData));
    }


    //删除元素
    public void remove(int index){
        //判断
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("数组越界!");
        }
        String[] eledelete=elementData;
        //删除后的新数组
        elementData=new String[size-1];
        int j=0;
        for (int i = 0; i < size; i++) {
            if(!(i==index)){
                elementData[j++]=eledelete[i];
            }
        }
        System.out.println(Arrays.toString(elementData));
        size--;
    }
}


结果:
在这里插入图片描述


在这里插入图片描述
这里只写了add添加和删除delete,大概ArraryList底层就是这样



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值