IO基础知识及示例整理(递归复制删除非空目录、模拟oj系统)

IO

基础知识

  • CPU只能与内存进行直接的数据交换,CPU和IO设备需通过内存作为中介进行数据交换。

  • 易失性存储:CPU(寄存器、三级缓存)、内存

    ​ —— 断电即丢失,以进程为单位进行管理

    持久性存储:硬盘、脱机存储(U盘、移动硬盘、磁带、光盘)、网络存储(网盘)

    ​ —— 断电不丢失,通常可以跨进程读写


    在这里插入图片描述

  • 变量、对象本质上都是编程语言对内存的抽象。

    文件是对硬盘中数据的抽象。

  • 内存 RAM(Random Access Memory)随机存取存储器,每个内存空间都有唯一的内存地址,内存寻址类似于根据下标访问数组,支持 O(1) 的时间复杂度(随机存取)。

  • 磁盘寻址需要旋转盘片找到对应的扇区和具体磁道,耗时长,故速度慢。
    磁盘更适合进行连续数据的读写操作,不适合随机读写。

  • 文件树结构只是一个逻辑结构,并不是硬盘上存储的实际物理结构。

  • 文件分为两大类:目录、普通文件。

    普通文件包含:文本文件(可读懂)、二进制文件(读不懂)。

    文本文件格式如:.txt .java
    二进制文件格式如:.png .class

  • 代码中的文件路径分隔符使用 \\/

  • 文件树中的结点分为 叶子结点 和 非叶子结点 。

    普通文件:叶子结点

    目录文件:非叶子结点、叶子结点(空目录)

  • 文件的移动:剪切粘贴、重命名

  • 移动、复制操作:
    普通文件 —— 对结点进行操作
    目录文件 —— 对整棵子树进行操作

  • 文件的删除:默认情况下只能删除结点,不能删除整棵子树(需逐个结点遍历删除)。

    ​ 即可删除普通文件、空目录,不可删除非空目录。

遍历删除非空目录

深度优先遍历文件树,判断是目录则继续递归删除,是文件则直接删除。

对于目录的递归删除:先递归后删除

DeleteTraversal(file);
file.delete();

递归代码会未到达底层时会卡在该行,直到底层才会向下执行删除代码,此时将叶子结点的空目录删除,返回上层,此时上层的非空目录也变为了空目录,上层也得以向下执行删除代码,删除空目录,以此逐层向上“归”实现整棵树的删除。

public class TraversalTest {
   

    public static void main(String[] args) throws Exception {
   
        File file = new File("D:\\Learn\\Bit\\ee\\iotest");
        System.out.println(file.delete());  //输出false,无法删除非空目录
        DeleteTraversal(file);  //递归删除iotest目录下的所有文件
        System.out.println(file.delete());  //输出true,删除iotest目录本身(此时已为空目录)
    }

    /**
     * 深度优先遍历删除非空目录
     * @param dir 目录对应的根结点
     */
    public static void DeleteTraversal(File dir) throws IOException {
   
        //当前目录的下级孩子结点(不包括孙子结点)
        File[] files = dir.listFiles();
        //遍历每个孩子结点,若是非空目录则继续递归,若是空目录、普通文件则删除
        for(File file : files) {
   
            //是目录,需继续递归删除
            if(file.isDirectory()) {
   
                // 去除文件路径中无意义的./和../    第一个反斜杠为转义字符,输出一个反斜杠(区分目录和文件)
                System.out.println(file.getCanonicalPath() + "\\");
                //继续递归遍历此孩子目录
                DeleteTraversal(file);
                //当遍历结束即递归到底时,此时目录一定为空目录,可删除
                file.delete();
                /* 删除代码置于递归代码后方的原因:
                   删除最底层的空目录后返回到上一层的递归代码处,此时上一层的非空目录也已经变为空目录,继续向下执行删除代码,删除空目录,逐层向上“归”实现整棵树的删除
                 */
            }
            //是文件,直接删除
            if(file.isFile()) {
   
                System.out.println(file.getCanonicalPath());
                file.delete();
            }
        }
    }
}

测试结果:

delete()和deleteOnExit()

delete()方法:立即删除文件,但只能删除叶子结点(普通文件、空目录),不能删除非空目录。

true:删除成功

false:要删除的文件不存在 / 删除的是非空目录

IOException:其他异常情况,如文件正在被其他进程打开使用

deleteOnExit()方法:不立即删除文件,待到 JVM 退出时才真正删除。

  • delete()方法的删除不进入回收站,直接删除无法找回。

    Windows系统进入回收站的删除,只是将删除的文件剪切到一个固定目录下。

File方法总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

try-with-resources 语法糖

语法:try(定义变量){}
属于语法糖,编译后自动添加close()释放资源的代码,帮助程序员简化代码书写。

字符集

UTF-8为变长的编码规则,一个字符占用的空间为1~4字节不等。

ASCII码范围内的字符仍然占用一个字节。中文字符一般占用3个字节。

简单示例

查找符合条件的文件并删除
public class FindAndDelete {
   

    public static void main(String[] args) throws IOException {
   

        // 1.先遍历文件树,查找所有符合条件的文件,存入List<File>中
        String rootPath = "D:\\Learn\\Bit\\ee\\iotest";  //根目录路径
        String condition = ".doc";  //文件符合的条件
        List<File> resultList = new ArrayList<>(</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值