File 类练习

news2024/12/24 3:21:56

练习1:在当前模块下的aaa文件夹中创建一个a.txt文件。

分析:当前模块下是没有aaa文件夹的,这里我是手动在当前模块下创建了aaa文件夹,然后在指定a.txt的路径,再createNewFile()的。

public class File1 {
    public static void main(String[] args) throws IOException {
        String path = "C:\\Users\\Administrator\\Desktop\\aaa\\a.txt";
        File file = new File(path);
        file.createNewFile();
    }
}

修改:手动在当前模块下创建aaa文件夹是有问题的,需要用代码创建aaa文件夹,然后再createNewFile()文件a.txt,修改后的代码如下:

public class File1 {
    public static void main(String[] args) throws IOException {
        File file = new File("aaa");
        file.mkdirs();
        new File(file,"a.txt").createNewFile();
    }
}

练习2:定义一个方法,找某一个文件夹中是否有以avi结尾的电影。(暂时不考虑子文件夹)

这里我将需求修改为是否有以png结尾的图片。

分析:

  • 首先的到文件夹下的所有内容:listFiles()
  • 通过遍历依次得到文件夹下的每一个文件或者文件夹
  • 然后获取名字,并比较是否以png结尾
public class File2 {
    public static void main(String[] args) {
        File file = new File("D:\\Java学习资料\\day27-IO(异常&File&综合案例)\\笔记\\imgs");
        File[] files = file.listFiles();
        for (File file1 : files) {
            if(file1.getName().endsWith("png"))
            System.out.println(file1);
        }
    }
}

修改:还有一点就是需要判断是否为文件。然后也并没有根本要求将其定义为方法,所以使用crtl+alt+M抽取为一个方法命名为contains,

public class File2 {
    public static void main(String[] args) {
        File file = new File("D:\\Java学习资料\\day27-IO(异常&File&综合案例)\\笔记\\imgs");
        System.out.println(contains(file));
    }

    private static boolean contains(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if(f.isFile() && f.getName().endsWith("png"))
            return true;
        }
        return false;
    }
}

练习3:找到电脑中所以以avi结尾的电影,需考虑子文件夹。

实现:自己是没有什么思路的。

学习:视频中讲解的是使用递归的思想。

关于递归必须有终止条件,即在什么时候不会再递归下去。这里是当遍历的文件夹下都是文件时递归终止。

思路:

  • 首先的到文件夹下的所有内容:listFiles()
  • 通过遍历依次得到文件夹下的每一个文件或者文件夹
  • 然后如果是文件则获取名字,并比较是否以png结尾
  • 如果是文件夹则递归调用此方法

还有一个问题运行时可能会出现空指针异常,为什么呢? 

在访问文件夹时需要注意,因为有的文件夹是没有权限访问的,此时调用listFiles()方法的返回值为null。所以变量files有可能为空,如果为空则在运行时会报空指针异常,为了避免这种情况,所以要加一个判断:if (files != null)。

运算符:!=,不等于

public class File3 {
    public static void main(String[] args) {
        File file = new File("D:\\Java学习资料\\day27-IO(异常&File&综合案例)\\笔记");
        findPNG(file);
    }

    private static void findPNG(File file) {
        File[] files = file.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isFile() && f.getName().endsWith("png")) {
                    System.out.println(f);
                } else {
                    findPNG(f);
                }
            }
        }
    }
}

思考:以前只有一个进行递归,这里是数组中的多个进行递归。优先深度再广度。

练习4:删除一个多级文件夹。

从里往外删。

这里是当文件夹下没有文件夹时递归终止。

当删除文件夹下的所有内容时,却忘记删除原来的文件夹,这是因为我只考虑什么时候递归往下进行,却没考虑递归什么时候回来。

如何使用递归去解决问题呢?当使用递归时应该如何思考呢?

public class File4 {
    public static void main(String[] args) {
        delete(new File("C:\\Users\\Administrator\\Desktop\\aaa"));
    }
    public static void delete(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                delete(f);
            }
            else {
                f.delete();
            }
        }
        file.delete();
    }
}

练习5:统计一个文件夹的总大小。

这里我是定义了一个共享变量。

public class file5 {
    static long sumLength = 0;
    public static void main(String[] args) {
        System.out.println(countLength(new File("D:\\Java学习资料\\day27-IO(异常&File&综合案例)\\笔记")));
    }
    private static long countLength(File file) {
        File[] files = file.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isFile()) {
                    sumLength += f.length();
                } else {
                    countLength(f);
                }
            }
        }
        return sumLength;
    }
}

输出结果: 

f4604a975c364e449fa194a6dfea08a3.png 9e60611a4fe947bf9fb5e8936fff3e4e.png

我这种方法是有弊端的,因为在实际使用countLength这个方法的时候怎么可能再额外定义一个静态变量,根本不合理。

所以视频里的思路是将记录大小的变量len定义为局部变量。

这种思路下只需考虑此文件夹下所有文件的大小和子文件夹总的大小。而子文件夹的大小如何计算是不用管的。

public class demo2 {
    public static void main(String[] args) {
        System.out.println(countLength(new File("D:\\Java学习资料\\day23-集合(泛型&Set&数据结构)\\笔记")));
    }
    public static long countLength(File file) {
        long len = 0;
        File[] files = file.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isFile()) {
                    len += f.length();
                } else {
                    len += countLength(f);
                }
            }
        }
        return len;
    }
}

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

打印格式如下:

txt:3个

doc:4个

jpg:6个

(1)如何统计?

对于这个练习,如果使用普通的变量去统计,并不知道有什么类型的文件,也就不知道要定义多少个变量去统计,所以就用到了Map集合。

刚开始依然想把HashMap定义为静态变量,其实是不合适的。后面定义为局部变量。

(2)思路:

首先将一个文件夹下的每种文件类型用HashMap存储起来

但是子文件中的HashMap如何合并呢?

取出sonMap中的所有key,判断是否在父文件夹的HashMap中存在,如果存在则两个Map中的值直接相加,不存在则放上去。

(3)HashMap中有一个方法是用来判断key是否存在的:containsKey()。

(4)但是我没有考虑到的一种情况就是没有后缀名的文件,在这种情况下进行切割的返回值直接就是文件名,而我们是不统计没有后缀名的文件的,所以要增加一个判断:if (str.length >= 2)

public class demo4 {
    
    public static void main(String[] args) {
        HashMap<String, Integer> hm = count(new File("src"));
        for (Map.Entry<String, Integer> entry : hm.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue() + "个");
        }

    }
    public static HashMap<String, Integer> count(File file) {
        HashMap<String,Integer> hashMap = new HashMap<>();
        File[] files = file.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isFile()) {
                    String[] str = f.getName().split("\\.");
                    if (str.length >= 2) {
                        String name = str[str.length - 1];
                        if (hashMap.containsKey(name)) {
                            int count = hashMap.get(name);
                            count++;
                            hashMap.put(name, count);
                        } else {
                            hashMap.put(name, 1);
                        }
                    }
                }
                else {
                    HashMap<String, Integer> hashMap1 = count(f);
                    Set<String> names = hashMap1.keySet();
                    for (String name : names) {
                        if (hashMap.containsKey(name)) {
                            hashMap.put(name, hashMap.get(name) + hashMap1.get(name));
                        } else {
                            hashMap.put(name, hashMap1.get(name));
                        }
                    }
                }
            }
        }
        return hashMap;
    }
}

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

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

相关文章

一键重装系统哪个软件好用_2024年一键重装系统工具排行榜

一键重装系统哪个软件好&#xff1f;现在市面上重装软件五花八门&#xff0c;有些网友不知道哪些好用&#xff0c;下面小编就为大家整理几款不错的电脑一键重新系统软件供大家选择&#xff0c;现整理2024年一键重装系统软件排行。 一键重装系统哪个软件好用&#xff1f; 一键重…

如何系统地自学Python?AI的回答让你少走三年弯路!

系统地自学Python是一个循序渐进的过程&#xff0c;需要掌握基础知识、进阶技能以及实践项目。以下是一个详细的自学Python的指南&#xff1a; 一、学习准备<末尾有AI整理的学习资料、电子书籍、实战项目> 了解Python&#xff1a; Python是一种流行的编程语言&#xff…

入门 PyQt6 看过来(案例)22~ 图表案例

​ ​ def showPie(self):"""绘制饼状图"""# &#xff08;1&#xff09;创建图表和视图chart QChart()chart.setTitle(中国高等教育普及率)chart.legend().setAlignment(Qt.AlignmentFlag.AlignLeft)chartView QChartView(self) # 必须有sel…

CookieMaker工作室合作开发C++项目十一:拟态病毒

&#xff08;注&#xff1a;本文章使用了“无标题技术”&#xff09; 一天&#xff0c;我和几个同事&#xff0c;平台出了点BUG&#xff0c;居然给我刷出了千年杀&#xff0c;同事看得瑕疵欲裂&#xff0c;发誓要将我挫骨扬灰—— &#xff08;游戏入口&#xff1a;和平精英31.…

iOS技术之安装nvmnode完整步骤

1.前提 首先电脑里得有brew、git、vscode这些工具, 当然了要用nvm&node肯定是需要这些基本开发工具 2.删除node环境 如果mac里没有安装过node、npm可以无视直接去 3 安装nvm。 为了保证安装nvm能够成功管理node&#xff0c;必须把电脑里之前安装的node全部清理&#xf…

微信小程序css中配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法

配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法 overflow_title{display: -webkit-box;-webkit-line-clamp: 1;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis; }只需要加上这两行css代码即可 word-break:break-all;…

Spring泛型的依赖注入

泛型依赖注入就是允许我们在使用spring进行依赖注入的同时&#xff0c;利用泛型的优点对代码进行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改。同时在不增加代码的情况下增加代码的复用性。

Go切片深入学习

Go切片专项学习 go切片扩容机制 go1.18 之前&#xff1a; 1.如果期望容量大于当前容量的两倍就会使用期望容量&#xff1b; 2.如果当前切片的长度小于 1024 就会将容量翻倍&#xff1b; 3.如果当前切片的长度大于 1024 就会每次增加 25% 的容量&#xff0c;直到新容量大于期…

基于AI大模型的数据治理

— 01— 什么是大模型&#xff1f; 大模型是指具有数千万甚至数亿参数的深度学习模型。近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果&#xff0c;如自然语言处理&#xff0c;图片生成&#xff0c;工业数字化等。为了提…

如何快速下载huggingface大模型

Stackoverflow 上有个AI开发入门的最常见问题 How to download model from huggingface?&#xff0c;回答五花八门&#xff0c;可见下载 huggingface 模型的方法是十分多样的。 其实网络快、稳的话&#xff0c;随便哪种方法都挺好&#xff0c;然而结合国内的网络环境&#xf…

如何给微信小程序商城增加直播购物功能

作者&#xff1a;阿龙 当前&#xff0c;随着抖音、快手、淘宝、拼多多等平台直播卖货的崛起&#xff0c;消费者已经习惯了在直播间购物模式&#xff0c;它可以实现卖家和用户之间的互动&#xff0c;实时解答用户的疑问&#xff0c;让用户可以放心下单购买。东方甄选、董宇辉、李…

LeetCode每日一题_3143.正方形中的最多点数

解题思路&#xff1a;自己&#xff1a;先把points里的点拿来求出坐标系的离原点最远的点&#xff0c;然后根据最远距离新建一个数组&#xff0c;然后把points的点都在新建的数组上标记出来。然后再便利从边长为0的正方形开始&#xff0c;里面是否有重复的标签。但是代码写不出来…

1.MongoDB入门指南之开篇

1. 写在前面 MongoDB大家可能听说过&#xff0c;但是要怎么学习&#xff1f;先学习哪个&#xff0c;很多人是不知道的&#xff0c;毕竟面对一个未知的事物&#xff0c;迷茫是很多人都会遇到的&#xff0c;从今天起我们就开始系统的介绍MongoDB的学习。 2. 课程介绍 课程主要分…

代理模式和Spring MVC

Spring是一个分层的轻量级的开源Java框架。核心是IOC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程) AOP 面向切面 AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程&#xff0c;AOP 是一种编程思想&#x…

Antd - Table 父子表格Checkbox联动

Antd - Table 父子表格Checkbox联动 前言一. 勾选父子组件联动二. 效果 前言 由于Antd中的父子组件之间&#xff0c;如果有多选功能&#xff0c;那么不会有联动的关系&#xff0c;需要自己实现。 一. 勾选父子组件联动 代码如下&#xff1a; import React, { useState } fr…

微搭如何设置隐私协议

目录 1 创建数据源2 创建应用3 校验隐私协议是否同意4 实际的效果 小程序里如果涉及收集用户隐私信息的&#xff0c;需要提供隐私协议&#xff0c;微搭中如何实现呢&#xff1f; 1 创建数据源 我们创建两个数据源&#xff0c;一个是个人信息采集表&#xff0c;一个是隐私协议表…

2024最全面软件测试2000+面试题附答案详解,卷起来

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全&#xff0c;其中概括的知识点有&#xff1a;软件测试基础&#xff0c;MySQL&#xff0c;liunx&#xff0c;接口测试&#xff0c;APP测试…

C ++测试随机数

//输出0-15的数字 #include <iostream> #include <string> using namespace std; //更好的办法是使用数组来存储 方便索引 循环 void test01() {srand(time(0));int t0 0;int t1 0;int t2 0;int t3 0;int t4 0;int t5 0;int t6 0;int t7 0;int t8 0;in…

vs-2015安装教程

双击安装包 2-如图先选自定义&#xff0c;然后选安装路径&#xff08;英文路径&#xff09; 3-安装选项一个就够了&#xff0c;如图 4-点击下一步&#xff0c;之后如下图 5-点击安装 启动&#xff0c;如图则恭喜你成功安装

乐观锁与悲观锁:并发控制

乐观锁与悲观锁&#xff1a;并发控制 1、乐观锁2、悲观锁 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 乐观锁和悲观锁作为两种关键的同步机制&#xff0c;以截然不同的方式应对数据冲突。 1、乐观锁 定义&#xff1a; 乐观锁认为数据冲…