JAVA-File五个练习

文章讲述了在Java中进行文件和文件夹操作,包括创建文件夹、检查文件夹中的特定类型文件(如MP4)、递归遍历文件夹、删除多级文件夹、统计文件夹大小以及统计文件种类。
摘要由CSDN通过智能技术生成

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

### 回答1: JavaFile类提供了获取文件信息的方法,可以通过该类获取文件的名称、路径、大小等信息。以下是一些常用的方法: 1. 获取文件名称: ```java File file = new File("文件路径"); String fileName = file.getName(); ``` 2. 获取文件路径: ```java File file = new File("文件路径"); String filePath = file.getPath(); ``` 3. 获取文件的绝对路径: ```java File file = new File("文件路径"); String absolutePath = file.getAbsolutePath(); ``` 4. 获取文件大小: ```java File file = new File("文件路径"); long fileSize = file.length(); ``` 需要注意的是,获取文件信息的方法都需要先创建一个File对象,该对象可以通过文件路径来创建。当我们在Java需要读取或写入文件时,通常会使用File类。File类提供了一些方法来获取有关文件的信息,如文件名、大小、最后修改时间等。以下是一些获取文件信息的示例: 1. 获取文件名: ```java File file = new File("example.txt"); String fileName = file.getName(); System.out.println("文件名为:" + fileName); ``` 2. 获取文件大小: ```java File file = new File("example.txt"); long fileSize = file.length(); System.out.println("文件大小为:" + fileSize + " bytes"); ``` 3. 获取文件最后修改时间: ```java File file = new File("example.txt"); long lastModified = file.lastModified(); Date date = new Date(lastModified); System.out.println("文件最后修改时间为:" + date); ``` 4. 判断文件是否存在: ```java File file = new File("example.txt"); if(file.exists()){ System.out.println("文件存在!"); }else{ System.out.println("文件不存在!"); } ``` 5. 获取文件绝对路径: ```java File file = new File("example.txt"); String absolutePath = file.getAbsolutePath(); System.out.println("文件绝对路径为:" + absolutePath); ``` 请注意,这些示例代码都需要处理文件I/O异常,例如FileNotFoundException和IOException。为了简化代码,这些异常处理代码已被省略。在实际应用,应该始终包括适当的异常处理代码。 ### 回答2: Java语言File类是一个用于封装文件和目录路径的类,它提供了一系列方法来获取文件信息、操作文件和目录等功能。在Java使用File类,可以方便地读取文件内容、创建、删除或者重命名文件或目录等操作。 获取文件信息是File类的一项重要功能,通过File对象提供的方法可以获取文件的相关属性,如文件名、文件大小、文件路径、最后修改日期等,提高了Jav开发的效率。 在Java,获取文件信息的方法主要有以下几种: 1. 获取文件名:file.getName() 该方法返回File对象所表示的文件或目录名,返回类型为字符串类型。 2. 获取文件路径:file.getPath() 该方法返回File对象所表示的文件或目录的完整路径,返回类型为字符串类型。 3. 获取文件大小:file.length() 该方法返回文件大小,以字节为单位。 4. 判断文件是否存在:file.exists() 该方法用于判断File对象所表示的文件或目录是否存在,返回值为布尔类型。 5. 判断是否为文件file.isFile()或者file.isDirectory() 这两个方法分别用于判断该File对象是否为文件或目录,均返回布尔类型。 6. 获取最后修改时间:file.lastModified() 该方法用于获取文件或目录的最后修改时间,返回的是一个长整型值。 以上是File类获取文件信息的常用方法,开发人员在使用时可以根据实际需要选择合适的方法。 总之,Java语言File类在文件操作方面具有很强的扩展性和强大的功能。掌握File类的用法不仅可以帮助我们更方便地操作文件和目录,也对我们了解Java语言文件操作原理有很大的帮助。 ### 回答3: Java文件操作对于开发者来说是非常重要的一部分,因为在编写代码时必须经常涉及到文件的输入输出。而在Java,使用File类来获取文件信息是非常方便和常见的方法。 File类在Java是用来操作文件和目录的,提供了一系列获取文件信息的方法。通过使用这些方法,开发者可以获取文件的各种信息,比如文件是否存在、文件的路径、文件的大小、文件创建时间、文件的读写权限等等。下面我们来详细介绍一下File获取文件信息的相关方法。 首先,使用File类的构造方法可以创建一个File对象,该对象代表一个文件或目录。可以通过调用该对象提供的各种方法来获取文件的信息。下面来介绍一些常用方法: 1.判断文件是否存在:可以使用exists()方法来判断指定的文件是否存在。例如: File file = new File("D:/myfile.txt"); if(file.exists()) { //文件存在 } else { //文件不存在 } 2.获取文件路径:可以使用getPath()方法来获取文件的路径信息。例如: File file = new File("D:/myfile.txt"); String path = file.getPath(); 3.获取文件大小:可以使用length()方法来获取文件的大小,返回的是字节为单位的文件大小。例如: File file = new File("D:/myfile.txt"); long size = file.length(); 4.获取文件创建时间:可以使用lastModified()方法来获取文件创建时间。例如: File file = new File("D:/myfile.txt"); long time = file.lastModified(); Date date = new Date(time); System.out.println("文件创建时间为:" + date); 5.获取文件的读写权限:可以使用canRead()和canWrite()方法来获取文件的读写权限,如果文件可以读或写,则返回true,否则返回false。例如: File file = new File("D:/myfile.txt"); if(file.canRead()) { //文件可读 } if(file.canWrite()) { //文件可写 } 以上就是File获取文件信息的相关方法,作为Java开发者,我们需要掌握这些方法的使用,以方便在实际开发使用。同时,在使用这些方法时需要注意一些细节问题,比如需要处理异常等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成果、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值