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 {//如果是文件夹,递归,主要加上之前的lenlen=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.hqwc.cn/news/452641.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oc云渲染云渲染操作步骤

随着技术的飞速进步&#xff0c;云渲染已经日益成为一个主流的渲染选择。OC云渲染以其高效率、易用性和可靠性获得了广泛的认可和喜爱。尽管如此&#xff0c;对于刚入门的用户而言&#xff0c;掌握OC云渲染的正确方法可能仍旧是一项挑战。接下来&#xff0c;我们会详尽解释OC云…

vivado 手动设置自下而上的流量并导入网表、创建较低级别的网表

手动设置自下而上的流量并导入网表 要手动运行自下而上的流&#xff0c;请将较低级别的网表或第三方网表实例化为黑色盒子&#xff0c;Vivado工具在合成完成后将黑盒子融入完整的设计中。这个以下部分描述了该过程。 重要&#xff01;Vivado合成不合成或优化加密或非加密合成…

使用_NT_SYMBOL_PATH在启动VS前设置PDB路径

一、背景 由于公司相关项目的开发管理方式&#xff0c;导致公司会存在多个分支的版本正在开发/测试中。 在这样的背景下&#xff0c;我的日常工作中有时会出现存在某个分支的项目软件的某个功能出现了问题需要我去排查解决&#xff0c;而我当前并不在该分支上开发。于是只能安装…

AI重构千行百业!超声波俱乐部大湾区内部分享会圆满落幕

1月27日、28日&#xff0c;超声波俱乐部内部分享会第十六期、第十七期分别在深圳、广州召开&#xff0c;创梦天地、元气森林、新浪智库、百准、A2空间对活动进行了特别支持&#xff0c;六十余名AI领域的创始人和行业嘉宾出席分享会。 出席活动的嘉宾有&#xff1a; 超声波创始…

Kubernetes operator(五)api 和 apimachinery 篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第五篇&#xff0c;主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…

C++进阶(十)哈希的应用——位图布隆过滤器

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、位图1、位图概念2、位图的实现3、位图的应用 二、布隆过滤器1、布隆过滤器提出2、布隆过滤…

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考&#xff1a;https://github.com/parallax/jsPDF html2canvas参考&#xff1a;https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

List的模拟实现 迭代器

———————————————————— list与vector相比&#xff0c;插入、删除等操作实现的成本非常低&#xff0c;如果在C语言阶段熟悉理解过链表&#xff0c;那么现在实现起来list就显得比较简单&#xff0c;可以说操作层面上比vector更简洁&#xff0c;因为list没有扩…

【JavaEE进阶】 图书管理系统开发日记——伍

文章目录 &#x1f38b;前言&#x1f332;需求分析&#x1f384;约定前后端交互接口&#x1f333;实现服务器代码&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f343;修改前端代码⭕总结 &#x1f38b;前言 这次我们来实现图书管理系统的增加图书模块。…

一文学会yum源配置(联网/未联网)以及yum常用命令

1、yum源介绍 yum&#xff08;Yellow dog Updater Modified的简称&#xff09;&#xff0c;yum的宗旨是自动化地升级&#xff0c;安装/移除rpm包&#xff0c;收集rpm包的相关信息&#xff0c;检查依赖性并自动提示用户解决。yum的关键之处是要有可靠的repository&#xff0c;顾…

超维机器人年终总结大事记回顾

2023年&#xff0c;对于超维机器人来说&#xff0c;是充满挑战和机遇的一年。在这一年里&#xff0c;我们攻坚克难&#xff0c;持续创新&#xff0c;深度聚焦智能巡检机器人的发展&#xff0c;加强合作伙伴关系&#xff0c;不断优化产品和服务&#xff0c;不断提升客户体验&…

华为配置接口二三层切换示例

配置接口二三层切换示例 组网图形 图1 配置非自协商模式下速率和双工模式组网图 二三层切换简介配置注意事项组网需求配置思路操作步骤配置文件 二三层切换简介 基于接口板的硬件构造&#xff0c;某些形态设备上接口只能作为二层以太网接口&#xff0c;某些形态设备上接口…