File 类练习

练习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是否在Map中存在的: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;
    }
}

 

### 回答1: Java中的File提供了获取文件信息的方法,可以通过该获取文件的名称、路径、大小等信息。以下是一些常用的方法: 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中需要读取或写入文件时,通常会使用FileFile提供了一些方法来获取有关文件的信息,如文件名、大小、最后修改时间等。以下是一些获取文件信息的示例: 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来获取文件信息是非常方便和常见的方法。 FileJava中是用来操作文件和目录的,提供了一系列获取文件信息的方法。通过使用这些方法,开发者可以获取文件的各种信息,比如文件是否存在、文件的路径、文件的大小、文件的创建时间、文件的读写权限等等。下面我们来详细介绍一下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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值