32-File类相关的API练习题

File类相关的API练习题

1、练习:创建文件

  • 需求:

    在当前模块下的aaa文件夹中创建一个a.txt文件

package com.app.demo35_File_test;

import java.io.File;
import java.io.IOException;

public class Test1 {
    public static void main(String[] args) throws IOException {
        /*
           练习:创建文件
           需求:
             在当前模块下的aaa文件夹中创建一个a.txt文件
         */
        // 1.创建a.txt的父级路径
        File file = new File("comprehensive_exercises\\aaa");

        // 2.创建父级路径
        // 如果aaa文件夹已经存在,那么此时会创建失败
        // 如果aaa文件夹不存在,那么此时会创建成功
        file.mkdirs();

        // 3.拼接父级路径和子级路径
        File src = new File(file, "a.txt");
        if (src.createNewFile()) {
            System.out.println("创建成功!");
        }else {
            System.out.println("创建失败!");
        }
    }
}
创建成功!

Process finished with exit code 0

在这里插入图片描述



2、练习:单个文件夹查找文件

  • 需求:

    定义一个方法找某一个文件夹中,是否有以avi结尾的电影。

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

    在这里插入图片描述

  • 提前在E盘准备好的文件夹

    在这里插入图片描述


package com.app.demo35_File_test;

import java.io.File;

public class Test2 {
    public static void main(String[] args) {
        /*
            练习:单个文件夹查找文件
            需求:
              定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
              (暂时不需要考虑子文件夹)
         */
        File file = new File("E:\\JavaDevelop\\aaa");
//        File file = new File("E:\\JavaDevelop\\aaa\\bbb");
        boolean flag = haveAVI(file);
        if (flag) {
            System.out.println(file + "路径下有以avi结尾的电影~");
        } else {
            System.out.println(file + "路径下没有以avi结尾的电影~");
        }
    }

    /**
     * 找某一个文件夹中是否有以avi结尾的电影
     *
     * @param file 要找的文件夹
     * @return 查找结果:存在返回true,不存在返回false
     */
    public static boolean haveAVI(File file) {
        // 1.进入到文件夹中,获取所有里面所有的内容
        File[] files = file.listFiles();
        // 2.遍历files数组,依次得到每个元素
        for (File f : files) {
            // f: 依次表示文件夹中每一个文件或者文件夹的路径
            // 3.判断当前路径下的是否为文件 且 为avi结尾
            if (f.isFile() && f.getName().endsWith("avi")) {
                // 是,则说明avi结尾的电影存在,返回true
                return true;
            }
            // 否,则继续查找判断下一个路径
        }

        // 4.循环结束,说明仍然找不到,说明不存在,直接返回false
        return false;
    }
}
E:\JavaDevelop\aaa路径下没有以avi结尾的电影~

Process finished with exit code 0



3、练习:遍历磁盘查找文件

  • 需求:

    找到电脑中所有以avi结尾的电影

    (需要考虑子文件夹)

    在这里插入图片描述

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

  • 套路

    以后遇到查找文件的业务基本都是这个套路:

    1.进入文件夹
    2.遍历数组
    3.判断
    4.判断
    
package com.app.demo35_File_test;

import java.io.File;

public class Test3 {
    public static void main(String[] args) {
        /*
            练习:遍历磁盘查找文件
            需求:
              找到电脑中所有以avi结尾的电影
              (需要考虑子文件夹)

            分析:
               递归思想:把大问题拆分,拆到某一个文件夹中不包含其他文件夹为止!
               套路:
                以后遇到查找文件的业务基本都是这个套路:
                    1.进入文件夹
                    2.遍历数组
                    3.判断
                    4.判断
         */
        // 先尝试遍历一个磁盘
//        File src = new File("C:\\");
//        findAVI(src);
        // 再尝试遍历电脑中所有的磁盘
        findAVI();
    }

    /**
     * 查找电脑中所有以avi结尾的电影
     */
    public static void findAVI() {
        // 1.获取电脑中所有盘符的数组
        File[] arr = File.listRoots();
        // 2.遍历数组:依次得到电脑中的每个磁盘路径
        for (File f : arr) {
            // f: 依次表示电脑中的每个磁盘路径
            // 调用findAVI(File src)方法,传入磁盘路径f,查找该磁盘中所有以avi结尾的电影
            findAVI(f);
        }
    }

    /**
     * 查找磁盘中所有以avi结尾的电影
     * @param src   磁盘路径
     */
    public static void findAVI(File src) {
        // 1.进入文件夹: 获取所有内容的数组
        File[] files = src.listFiles();

        // 2.遍历数组: 依次得到文件夹中每一个文件或者文件夹
        /*
            遍历时会有个小bug:NullPointerException
            为什么?
            因为listFiles方法底层有些小细节:
                如果说方法的调用者是需要权限才可以进入的文件夹,
                那么listFiles方法就会返回一个null,
                因此在运行时会报一个异常:NullPointerException
         */
        // 解决办法:对files进行非空判断即可!
        if (files != null) {
            for (File file : files) {
                // 3.判断:file是否为文件
                if (file.isFile()) {
                    // 是文件
                    // 判断:file是否以avi结尾
                    if (file.getName().endsWith("avi")) {
                        // 是,则将文件路径打印出来
                        System.out.println(file);
                    }
                }else {
                    // 不是文件
                    // 那就是文件夹,此时使用递归
                    // 重新调用findAVI,然后进入当前这个文件夹,继续遍历,继续判断
                    // 一直到当前这个文件夹中不包含其他文件夹为止!
                    findAVI(file);
                }
            }
        }
    }
}
C:\jdk\demo\变形金刚.avi
C:\jdk\test\aaa\奥特曼.avi
C:\jdk\test\灿烂人生.avi
C:\jdk\小电影.avi
D:\Javadevelop\爱奇艺aa\bbb\jjj\三国演义.avi
D:\Javadevelop\爱奇艺aa\bbb\变形记.avi
E:\JavaDevelop\aaa\bbb\小电影.avi

Process finished with exit code 0



4、练习:删除文件夹

  • 需求:

    删除一个多级文件夹

  • 思路

    1. 先删除文件夹里面的所有的内容
    2. 再删除自己
package com.app.demo35_File_test;

import java.io.File;

public class Test4 {
    public static void main(String[] args) {
        /*
            练习:删除文件夹
            需求:
              删除一个多级文件夹
            思路:
              1.先删除文件夹里面的所有的内容
              2.再删除自己
         */
        File src = new File("D:\\demo");
        deleteFiles(src);
    }

    /**
     * 删除一个多级文件夹
     * @param src 要删除的文件夹路径
     */
    public static void deleteFiles(File src) {
        // 1.先删除文件夹里面的所有的内容
        // a.进入文件夹:获取所有内容的数组
        File[] files = src.listFiles();
        // b.判断files数组是否不为null
        if (files != null) {
            // c.遍历数组:依次得到里面的每一个文件或者文件夹
            for (File file : files) {
                // d.判断file是否为文件
                if (file.isFile()) {
                    // 是文件,则直接删除
                    file.delete();
                }else {
                    // 不是文件,是文件夹
                    // 则利用递归,将文件夹下的所有内容删除完毕之后,最终删除自己
                    deleteFiles(file);
                }
            }

            // 2.再删除自己
            src.delete();
            System.out.println("删除成功!");
        }else {
            System.out.println("该文件夹路径不存在~");
        }
    }
}
  • 第一次运行
删除成功!

Process finished with exit code 0

  • 第二次运行
该文件夹路径不存在~

Process finished with exit code 0



5、练习:统计文件夹大小

  • 需求:

    统计一个文件夹的总大小

  • 思路:说白了,就是统计文件夹里所有文件的大小

package com.app.demo35_File_test;

import java.io.File;
import java.math.BigDecimal;

public class Test5 {
    public static void main(String[] args) {
        /*
            练习:统计文件夹大小
            需求:
              统计一个文件夹的总大小
            思路:
              说白了,就是统计文件夹里所有文件的大小
         */
        File src = new File("E:\\JavaDevelop");
        long filesLength = getFilesLength(src);
        System.out.println("文件总大小为:" + filesLength + "字节");
        System.out.println("文件总大小为:" + (filesLength / 1024) + "KB");
        System.out.println("文件总大小为:" + (filesLength / 1024 / 1024) + "MB");
        System.out.println("文件总大小为:" + (filesLength / 1024 / 1024 / 1024) + "GB");
    }

    /**
     * 统计文件夹的总大小
     *
     * @param src 要统计的文件夹
     * @return 返回文件夹的总大小
     */
    public static long getFilesLength(File src) {
        // 先定义长度变量,用于记录文件夹的总大小
        int len = 0;

        // 1.进入文件夹:获取所有内容的数组
        File[] files = src.listFiles();

        // 2.遍历数组:依次得到文件夹中每一个文件或者文件夹
        for (File file : files) {
            // 3.判断file是否为文件
            if (file.isFile()) {
                // 是文件,则累加该文件的大小
                len += file.length();
            }else {
                // 不是文件,那就是文件夹,则递归,累加该文件夹中每一个文件的大小
                len += getFilesLength(file);
            }
        }

        // 3.循环结束,计算完毕,返回文件夹的总大小
        return len;
    }
}
文件总大小为:2084902801字节
文件总大小为:2036037KB
文件总大小为:1988MB
文件总大小为:1GB

Process finished with exit code 0



6、练习:统计各种文件数量

  • 需求:

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

    打印格式如下:
    txt:3个
    doc:4个
    jpg:6个
    ...
    
  • 思路

    1. 看到统计,就要想到计数器思想,但是这个数量太大,所以要使用集合
    2. 那要使用什么集合?看这个格式不像是键值对?对啦,直接使用Map集合
package com.app.demo35_File_test;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test6 {
    public static void main(String[] args) {
        /*
            练习:统计各种文件数量
            需求:
              统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
              打印格式如下:
              txt:3个
              doc:4个
              jpg:6个
              ...
            思路:
              1. 看到统计,就要想到计数器思想,但是这个数量太大,所以要使用集合
              2. 那要使用什么集合?看这个格式不像是键值对?对啦,直接使用Map集合
         */
        File src = new File("E:\\JavaDevelop\\aaa");
        HashMap<String, Integer> hm = getFileFormatCount(src);
        hm.forEach((key, value) -> System.out.println(key + ": " + value));
    }

    /**
     * 统计文件夹中各种文件的个数并打印
     * @param src 要统计的文件夹
     * @return  返回Map集合,键:后缀名,值:个数
     */
    public static HashMap<String, Integer> getFileFormatCount(File src) {
        // 先创建Map集合,用于存储各种文件的后缀名和个数
        HashMap<String, Integer> hm = new HashMap<>();

        // 1.进入文件夹:获取所有内容的数组
        File[] files = src.listFiles();
        // 2.遍历数组:依次得到文件夹中的每个文件或者文件夹
        for (File file : files) {
            // 3.判断file是否为文件
            if (file.isFile()) {
                // 是文件,例如:a.txt、a.a.md、aaa
                // a: 根据"."来截取该文件的名字和后缀
                String name = file.getName();
                String[] arr = name.split("\\.");

                // b: 判断数组的长度是否大于等于2
                if (arr.length >= 2) {
                    // 是,则获取该文件的后缀
                    String endName = arr[arr.length - 1];

                    // 判断该后缀是否存在于Map集合中
                    if (hm.containsKey(endName)) {
                        // 存在,则说明该后缀不是第一次出现
                        // 将该后缀原有的个数拿出来进行累加:
                        // a.根据后缀(key) 获取 对应的个数(value)
                        int count = hm.get(endName);
                        count++;

                        // b.将最新数据放进map集合
                        hm.put(endName, count);

                    } else {
                        // 不存在,则说明该后缀是第一次出现
                        // 直接将该后缀 和 个数1 放进map集合
                        hm.put(endName, 1);
                    }
                }
            }else {
                // 不是文件
                // 递归
                HashMap<String, Integer> sonMap = getFileFormatCount(file);
                // 将递归后的sonMap集合中的值 累加到 hm集合中:
                // a.遍历sonMap集合,得到所有文件后缀名(键) 和 个数(值)的对象
                Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    String key = entry.getKey();      // 获取后缀名
                    int value = entry.getValue();     // 获取个数
                    // 判断hm集合中是否存在该后缀名
                    if (hm.containsKey(key)) {
                        // 存在,则说明该后缀名不是第一次出现
                        // 将该后缀名在hm集合中原有的个数拿出来
                        int count = hm.get(key);
                        // 最新数据 = hm原有个数 + sonMap现有个数
                        count += value;

                        // 将最新数据放进hm集合中
                        hm.put(key, count);

                    } else {
                        // 不存在,则说明该后缀名是第一次出现
                        // 将该后缀名 和 个数 放进hm集合中
                        hm.put(key, value);
                    }
                }
            }
        }

        // 4.循环结束!统计完成,返回Map集合
        return hm;
    }
}
jpg: 2
txt: 3
avi: 1
ppt: 1
doc: 1
emmx: 2
xls: 1
docx: 1

Process finished with exit code 0

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值