JAVA-File五个练习

下面习题思路大多都是:
1.获取路径下所有列表(listfiles),2.遍历文件或文件夹(增强for),3.判断是否是文件(isFile)并直接执行逻辑,4.判断当前是文件夹的情况,可使用递归

需求:使用代码在当前模块下创建一个aaa文件夹,并在aaa文件夹下创建一个a.txt文件。

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


        //1.创建文件夹
        File f1=new File("..\\fileDemo\\aaa");
        System.out.println(f1.mkdirs());//true
        //2.创建文件
        //将父子路径拼接
        File f2=new File(f1,"a.txt");
        System.out.println(f2.createNewFile());//true
    }
}

前:image.png

后:image.png

…\表示项目的上级目录。 .\表示项目的当前目录


需求:定义一个方法找某一个文件夹中,__是否__有以mp4结尾的视频。

        (**暂时不需要考虑子文件夹)

思想:把大问题拆分,拆到某一个文件夹中不包含其他文件夹为止

public class Test02 {
    public static void main(String[] args) {
        
        //思路:视屏一定是一个文件,可以用ifFile判断,再判断是否endWith("mp4")

        //创建要查找的路径的file对象
        File file = new File("E:\\aaa");
        System.out.println(havaMp4(file));
    }

    public static boolean havaMp4(File f) {
        //1.进入aaa文件夹,而且要获取里面所有的内容
        File[] files = f.listFiles();
        //2.遍历数组获取里面的每一个元素
        for (File file : files) {
            //file:依次表示aaa文件夹里面每一个文件或者文件夹的路径
            if (file.isFile() && file.getName().endsWith("mp4")) {
                return true;
            }
        }
        return false;
    }

}

E:\aaa下的所有文件或文件夹
image.png
上面这种方式仅仅只能判断当前文件夹,不能考虑aaa的子文件夹(eee、src),就是说它们里面如果有以mp4结尾的文件也是无法探测到的。


改进:
需求:在上面路径基础上,需要考虑子文件夹
思路:递归

public class Test03 {
    public static void main(String[] args) {

        File file = new File("E:\\aaa");
        havaMp4(file);
    }

    public static void havaMp4(File file) {
        //1.获取当前路径下所有列表
        File[] files = file.listFiles();
        //2.遍历files依次得到aaa里面每一个文件或者文件夹
        if (files!=null){
            for (File f : files) {
                //f表示路径下所有文件或文件夹
                if (f.isFile() && f.getName().endsWith("mp4")) {
                    //3,判断,如果是文件,就可以执行题目的业务逻辑
                    System.out.println(f);
                } else {
                    //4.当遍历到的是文件夹,则递归
                    //细节:再次调用本方法的时候,参数一定要是aaa的次一级路径
                    havaMp4(f);
                }
            }
        }

    }
}

控制台:
E:\aaa\eee\WeChat_20240204201838.mp4

实际上E:\aaa\eee下确实有一个mp4文件,
上面我们在遍历当前路径下的内容时做了非空判断,为什么?
因为有可能访问到隐藏的文件,此时会返回null

上面是获取E盘下的aaa文件夹,同理我们可以获取电脑中所有mp4文件

public class Test03 {
    public static void main(String[] args) {

        //调用这个方法即可获取电脑上所有mp4文件
        findInComputer();
    }


    public static void findInComputer(){
        //listRoots获取电脑上所有盘
        File[] files = File.listRoots();
        for (File file : files) {
            havaMp4(file);
        }
    }


    public static void havaMp4(File file) {
        //1.获取当前路径下所有列表
        File[] files = file.listFiles();
        //2.遍历files依次得到aaa里面每一个文件或者文件夹
        if (files!=null){
            for (File f : files) {
                //f表示路径下所有文件或文件夹
                if (f.isFile() && f.getName().endsWith("mp4")) {
                    //3,判断,如果是文件,就可以执行题目的业务逻辑
                    System.out.println(f);
                } else {
                    //4.当遍历到的是文件夹,则递归
                    //细节:再次调用本方法的时候,参数一定要是aaa的次一级路径
                    havaMp4(f);
                }
            }
        }


    }
}


需求:删除一个多级文件夹。

如果是删除一个单级文件夹(一个空白文件夹),直接调用删除方法即可,但是删除多级可以用到递归思想,不断删除

public class Test4 {
    public static void main(String[] args) {
        /*
           删除一个多级文件夹
           //之前我们说过删除方法只能*删除文件或*空白文件夹

           如果我们要删除一个有内容的文件夹
           1.先删除文件夹里面所有的内容
           2.再删除自己
        */

        File f = new File("E:\\aaa");
        delete(f);
    }

    public static void delete(File file) {
        /*先删除文件夹里面所有的内容*/
        //1.获取当前路径所有内容
        File[] files = file.listFiles();
        //2.遍历files依次得到aaa里面每一个文件或者文件夹
        for (File f : files) {
            if (f.isFile()) {
                //如果是文件直接删除即可
                f.delete();
            } else {
                //如果是文件夹,就递归
                delete(f);
            }
        }
        /*最后删除自己*/
        file.delete();
    }
}

删除前:
image.png
删除后:
aaa文件夹被删除

注意点:若此时aaa文件夹下有某个文件在另一处打开的话,该文件将无法被删除


需求: 统计一个文件夹的总大小

public class Test05 {
    public static void main(String[] args) {

        
        File file=new File("E:\\aaa");
        System.out.println(getLen(file));
    }
    public static long getLen(File file){
        //1.获取当前路径下所有列表
        File[] files = file.listFiles();
        //2.遍历每一个文件或文件夹
        long len=0;
        for (File f : files) {
            if (f.isFile()){
                //如果是文件直接计算文件大小
                len=len+f.length();
            }else {
                //如果是文件夹,递归,主要加上之前的len
                len=len+getLen(f);
            }
        }
        return len;
    }
}

控制台:
7440

完全一样:
image.png


需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)

如:
txt:3个
doc:4个
jpg:6个

思路:看见统计可以用map集合
键放后缀名 值放次数

public class Test06 {
    public static void main(String[] args) {
        /*
            需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
            打印格式如下:
            txt:3个
            doc:4个
            jpg:6个
        */

        File f = new File("E:\\aaa");
        HashMap<String, Integer> count = getCount(f);
        System.out.println(count);
    }

    /**
     * 要考虑的情况
     * a.txt
     * a.a.txt
     * aaa(不需要统计的)
     */
    public static HashMap<String, Integer> getCount(File file) {
        //定义map集合
        HashMap<String, Integer> hm = new HashMap<>();
        //获取当前路径下所有列表
        File[] files = file.listFiles();
        //遍历获取所有文件或文件夹
        for (File f : files) {
            if (f.isFile()) {
                String name = f.getName();
                String[] split = name.split("\\.");
                //获取字符数组的最后一个片段,就是防止特殊情况有两个点
                String endName = split[split.length - 1];

                if (hm.containsKey(endName)) {
                    //如果map集合内有当前后缀,说明改后缀已经出现过,拿出值加一即可
                    Integer value = hm.get(endName);
                    value++;
                    hm.put(endName, value);
                } else {
                    //如果没有当前后缀说明,当前后缀没有出现过
                    hm.put(endName, 1);
                }
            } else {
                //如果是文件夹,递归
                //但是有一个问题,子文件夹的个数如何与之前的已经统计的个数联系起来
                HashMap<String, Integer> sonMap = getCount(f);
                //首先遍历获取,子文件夹中不同后缀的个数各有多少个
                Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    String key = entry.getKey();//后缀
                    int value = entry.getValue();//后缀
                    if (hm.containsKey(key)) {
                        //如果已经统计的map集合中有当前后缀名,则加一块即可,最后放回去即可
                        Integer i = hm.get(key);
                        i = i + value;
                        hm.put(key, i);
                    } else {
                        //如果已经统计的map集合中没有当前后缀名,就把当前统计到的放入即可
                        hm.put(key, value);
                    }
                }
            }
        }
        return hm;
    }
}

{mp4=1, txt=7, png=16, webp=11}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/371736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【React】redux状态管理、react-redux状态管理高级封装模块化

【React】react组件传参、redux状态管理 一、redux全局状态管理1、redux概述2、redux的组成1.1 State-状态1.2 Action-事件1.3 Reducer1.4 Store 3、redux入门案例1.1 前期准备1.2 构建store1.2.1 在src下新建store文件夹1.2.2 在store文件夹下新建index.ts文件1.2.3 在index.t…

Swift Vapor 教程(查询数据、插入数据)

上一篇简单写了 怎么创建 Swift Vapor 项目以及在开发过程中使用到的软件。 这一篇写一个怎么在创建的项目中创建一个简单的查询数据和插入数据。 注&#xff1a;数据库配置比较重要 先将本地的Docker启动起来&#xff0c;用Docker管理数据库 将项目自己创建的Todo相关的都删掉…

【python】python爱心代码【附源码】

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码&#xff1a; import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…

STM32F407 CAN参数配置 500Kbps

本篇CAN参数适用 芯片型号&#xff1a;STM32F407xx系统时钟&#xff1a;168MHz&#xff0c;CAN挂载总线APB1为42M波 特 率 &#xff1a;500Kpbs引脚使用&#xff1a;TX_PB9&#xff0c;RX_PB8&#xff1b;修改为PA11PA12后&#xff0c;参数不变。 步骤一、打勾开启CAN&#xf…

vue使用es的reduce方法编译报错Error: Can‘t resolve ‘core-js/modules/es.array.reduce.js‘

哈喽 大家好啊 最近在vue使用es的reduce方法编译报错Error: Cant resolve core-js/modules/es.array.reduce.js 报错如图所示&#xff1a; 解决方案&#xff1a; npm install --save core-js 然后重新编译下将正常了 参考原文: 使用import异步加载语法报错_module not foun…

CAD-autolisp(四)——编译

目录 一、编译1.1 界面操作1.2 生成的应用程序&#xff08;二选一&#xff09; 二、后续学习 一、编译 编译&#xff1a;lsp后缀名为原文件&#xff0c;后缀名为fas、vlx为编译后文件&#xff0c;其会把sld、dcl、lsp等文件都编译进一个应用程序文件中加载&#xff1a;cad命令…

ZigBee学习——在官方例程基础实现点灯

IAR版本 :10.10.1 Z-stack版本 :3.0.2 文章目录 一、买的板子原理图二、实现过程2.1 重定义LED的物理映射(HAL层)2.2 创建LED事件(应用层)2.2.1 定义用户事件2.2.2 修改zclGenericApp_event_loop() 2.3 触发事件 一、买的板子原理图 二、实现过程 2.1 重定义LED的物理映射(HAL…

windows10忘记密码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

处理SERVLET中的错误

处理SERVLET中的错误 问题陈述 一位用户在使用在线计算机应用程序时输入一个非数字字符做数字加法。servlet试图将用户输入的值转换成整数型时,引发了NumberFormException类型的异常。要创建一个Web应用程序来使用自定义错误页面处理该异常。该自定义错误页面需要向用户提供关…

uniapp android和微信小程序实现PDF在线预览

在使用uniapp开发移动端时&#xff0c;微信开发者工具里webview能正常打开后端接口返回的pdf文件流。正式发布后&#xff0c;在配置了业务域名和服务器域名的前提下&#xff0c;预览pdf文件却只能看到白屏&#xff0c;因此我猜测微信小程序不能通过webview读取文件流。这个想法…

笔记本电脑的WIFI模块,突然不显示了,网络也连接不上

问题复现&#xff1a; 早上&#xff0c;在更新完笔记本电脑的系统之后&#xff0c;连网之后&#xff0c;网络突然直接断开&#xff0c;一查看&#xff0c;WiFi模块居然不见了&#xff0c;开机重启也是如此&#xff0c;这种情况常常出现在更新系统之后&#xff0c;WiFi模块驱动就…

Unix五种I/O模型(阻塞、非阻塞、多路复用、信号驱动、异步)

文章目录 概要一、I/O基础二、阻塞式I/O三、非阻塞式I/O三、I/O多路复用四、信号驱动I/O五、异步I/O六、小结 概要 在工作中&#xff0c;经常使用Nginx、Redis等开源组件&#xff0c;常提到其高性能的原因是网络I/O的实现是基于epoll&#xff08;多路复用&#xff09;。这次呢…

复制命令COPY

copy在英文中是复制的意思&#xff0c;所谓复制就是原来的文件并没有任何改变&#xff0c;重新产生了一个内容和原来文件没有任何差别的文件。复制&#xff08;copy&#xff09;命令主要用于复制一个或更多个文件到指定的位置&#xff0c;该命令可以被用于合并文件&#xff0c;…

ES6-数组的解构赋值

一、数组的解构赋值的规律 - 只要等号两边的模式相同&#xff0c;左边的变量就会被赋予对应的值二、数组的解构赋值的例子讲解 1&#xff09;简单的示例&#xff08;完整的解构赋值&#xff09; 示例 //基本的模式匹配 // a&#xff0c;b,c依次和1&#xff0c;2&#xff0c…

Element UI+Spring Boot进行CRUD的实例

ElementUI安装与使用指南 前端代码&#xff1a;点击查看learnelementuispringboot项目源码 后端代码&#xff1a;点击查看 LearnElementUiAndSpringBoot 一、前端配置 安装axios Gitee的axios介绍与使用 GitHub的axios介绍与使用 方式一&#xff1a;使用npm安装 $ npm in…

深度学习(生成式模型)—— Consistency Models

文章目录 前言预备知识&#xff1a;SDE与ODEMethod实验结果 前言 Diffusion model需要多次推断才能生成最终的图像&#xff0c;这将耗费大量的计算资源。前几篇博客我们已经介绍了加速Diffusion model生成图像速率的DDIM和Stable Diffusion&#xff0c;本节将介绍最近大火的Co…

力扣热门100题刷题笔记 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目链接&#xff1a;5. 最长回文子串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。示例&#xff1a; 输入&#xff1a;s "…

【DDD】学习笔记-数据设计模型

通过分析活动获得的数据项模型&#xff0c;可以认为是数据分析模型&#xff0c;它确定了系统的主要数据表、关系及表的主要属性。到了建模的设计活动&#xff0c;就可以继续细化数据项模型这个分析模型&#xff0c;例如丰富每个表的列属性&#xff0c;或者确定数据表的主键与外…

从零开始手写mmo游戏从框架到爆炸(二)— 核心组件抽离与工厂模式创建

上一章我们已经完成了一个基本netty的通信&#xff0c;但是netty的启动很多代码都是重复的&#xff0c;所以我们使用工厂模式来生成不同的ServerBootstrap。 首先创建一个新的组件core组件&#xff0c;和common组件&#xff0c;主要用于netty通信和工具类&#xff0c;从server…

[Android] 240204批量生成联系人,短信,通话记录的APK

平常在做测试的时候&#xff0c;需要批量生成很多测试数据&#xff1b; 陌生人 联系人名字的生成支持随机生成&#xff0c;也可以自定义生成&#xff0c;自定义生成陌生人的数据&#xff0c;联系人的名字是否带索引&#xff1b; 通话记录 随机生成通话记录&#xff0c;在生…