JAVA-File五个练习

news2024/11/28 7:46:08

下面习题思路大多都是:
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}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK和Spring的SPI机制原理分析

目录 一、JDK 二、Spring框架介绍 三、SPI机制原理 一、JDK JDK是Java Development Kit的缩写&#xff0c;是Java开发工具包的意思。它是用于开发Java应用程序和运行Java程序的软件包。JDK包含了Java编译器&#xff08;javac&#xff09;和Java虚拟机&#xff08;JVM&#…

免费的hyper-v虚机添加U盘的二种方法

windows集成了hyper-v&#xff0c;hyper-v可以安装linux&#xff0c;windows等虚机&#xff0c;基本可以满足工作&#xff0c;实验之需。但是不少人反映hyper-v不方便连接U盘&#xff0c;这样子文件传输不是很方便。 网上有方法说在虚机设置中添加磁盘&#xff0c;首先到物理机…

信创ARM架构QT应用开发环境搭建

信创ARM架构QT应用开发环境搭建 前言交叉工具链Ubuntu上安装 32 位 ARM 交叉工具链Ubuntu上安装 64 位 ARM 交叉工具链 交叉编译 QT 库下载 QT 源码交叉编译 QT 源码 Qt Creator交叉编译配置配置 Qt Creator Kits创建一个测试项目 前言 有没有碰到过这种情况&#xff1f;开发出…

ctfshow web-76

开启环境: c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). );} exit(0); ?> cinclude("/flagc.txt");exit(); c?><?php $anew DirectoryIterator("glob:///*"); foreach($a…

全流程机器视觉工程开发(四)PaddleDetection C++工程化应用部署到本地DLL以供软件调用

前言 我们之前跑了一个yolo的模型&#xff0c;然后我们通过PaddleDetection的库对这个模型进行了一定程度的调用&#xff0c;但是那个调用还是基于命令的调用&#xff0c;这样的库首先第一个不能部署到客户的电脑上&#xff0c;第二个用起来也非常不方便&#xff0c;那么我们可…

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…

2024年:用OKR管理你的生活

在科技高速发展的时代&#xff0c;越来越多的企业和团队开始采用OKR&#xff08;Objectives and Key Results&#xff09;管理方法来设定目标并跟踪进度。你是否想过&#xff0c;将OKR理念引入个人生活&#xff0c;以更有效地实现人生目标&#xff1f;本文将探讨如何在2024年运…

网络规划与部署实训

一 实训目的及意义 本周实训主要是了解网络规划与部署&#xff0c;熟悉三大厂商华为、思科、锐捷交换机路由器以及相关协议的原理和配置&#xff0c;提高学生的动手能力和分析规划部署能力。 实训主要针对计算机网络系统集成的设计与实现的实际训练&#xff0c;着重锻炼学生熟练…

让cgteamwork自动为Houdini载入相机,角色道具的abc文件

一 需求 最近接到个需求&#xff1a;在创建EFX文件时&#xff0c;自动加载动画出的缓存abc文件相机&#xff0c; 不用手动一个个的载入&#xff0c;还容易出错 ABC文件自动导入到Houndini里 二 过程/效果 在CGTeamwork里打开对应的镜头&#xff0c;下面的文件列表显示相机和角…

大型软件编程实例分享,诊所门诊处方笺管理系统多台电脑同时使用的软件教程

大型软件编程实例分享&#xff0c;诊所门诊处方笺管理系统多台电脑同时使用的软件教程 一、前言 以下教程以 佳易王诊所门诊电子处方管理系统V17.2 为例说明 软件资源可以点击最下方官网卡片了解详情 软件左侧为导航栏 1、系统参数设置&#xff1a;可以设置打印等参数 2、…

zabbix配置监控脚本

zabbix配置监控脚本 1.修改agent配置文件 [rootchang ~]# vim /etc/zabbix/zabbix_agentd.conf 333行 原# UnsafeUserParameters0 修改成 UnsafeUserParameters12.创建脚本与脚本存放目录 [rootchang ~]# mkdir /etc/zabbix/zabbix_scripts [rootchang zabbix_scripts]# vi…

BUUCTF-Real-ThinkPHP]5.0.23-Rce

漏洞介绍 这个版本容易存在我们都喜欢的rce漏洞&#xff01; 网站为了提高访问效率往往会将用户访问过的页面存入缓存来减少开销。而Thinkphp 在使用缓存的时候是将数据序列化&#xff0c;然后存进一个 php 文件中&#xff0c;这使得命令执行等行为成为可能&#xff01; ThinkP…

2.0 Hadoop 运行环境

由于 Hadoop 是为集群设计的软件&#xff0c;所以我们在学习它的使用时难免会遇到在多台计算机上配置 Hadoop 的情况&#xff0c;这对于学习者来说会制造诸多障碍&#xff0c;主要有两个&#xff1a; 昂贵的计算机集群。多计算机构成的集群环境需要昂贵的硬件.难以部署和维护。…

物联网与智慧景区的未来:机遇与挑战并存

随着科技的不断发展&#xff0c;物联网技术在智慧景区中的应用越来越广泛&#xff0c;为旅游业带来了巨大的变革。然而&#xff0c;在物联网与智慧景区的未来发展中&#xff0c;机遇与挑战并存。本文将探讨物联网与智慧景区面临的机遇和挑战&#xff0c;并提出应对措施&#xf…

【npm】修改npm全局安装包的位置路径

问题 全局安装的默认安装路径为&#xff1a;C:\Users\admin\AppData\Roaming\npm&#xff0c;缓存路径为&#xff1a;C:\Users\admin\AppData\Roaming\npm_cache&#xff08;其中admin为自己的用户名&#xff09;。 由于默认的安装路径在C盘&#xff0c;太浪费C盘内存啦&#…

LeetCode--121

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

1.0 Hadoop 教程

Hadoop 是一个开源的分布式计算和存储框架&#xff0c;由 Apache 基金会开发和维护。 Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持&#xff0c;它允许使用简单的编程模型跨计算机群集分布式处理大型数据集&#xff0c;并且支持在单台计算机到几千台计…

智慧港口:山海鲸可视化引领未来

随着疫情的结束&#xff0c;全球贸易迎来新的春天&#xff0c;港口作为物流枢纽的地位日益凸显。然而&#xff0c;传统港口的运营和管理方式已无法满足现代物流的需求。为了提高港口运营效率&#xff0c;降低成本&#xff0c;智慧港口的概念应运而生。作为山海鲸可视化的开发者…

适用于您站点的12个免费模态窗口库和插件

1. jQuery模态 寻找超级干净且易于使用的东西吗&#xff1f;然后jQuery Modal应该是您的首选资源。 这个可访问的插件可与键盘快捷键&#xff08;ESC关闭&#xff09;一起使用&#xff0c;甚至支持触摸操作。总库重约1KB&#xff0c;非常小。 更不用说实际的设计足够干净&…

路由引入路由过滤

目录 路由引入 什么是路由引入&#xff1f; 为什么需要路由引入&#xff1f; 路由引入的规划分为两种 路由过滤 路由过滤的工具 前缀列表格式 filter-policy router-policy 路由引入 什么是路由引入&#xff1f; 将一种协议导入到另一种协议或在同种协议的不同进程…