File类

概述

针对文件的操作,JDK提供了一个File类,该类封装了一个路径,提供了一系列方法用于操作该路径指向的文件。

File类封装的路径可以是相对当前文件夹的相对路径,也可是从系统盘符开始的绝对路径。

注意:
windows系统下,路径名的分隔符必须用"\\"转义。

File类常用构造方法

方法 描述
File(String pathname) 通过指定的一个字符串类型的文件路径创建一个新的File对象
File(String parent,String child) 根据指定的一个字符串型父路径和字符串型子路径(包含文件名称)创建一个File对象
File(File parent,String child) 根据指定的File类父路径和字符串型子路径(包含文件名)创建一个File对象

File类常用方法

方法 描述
boolean exists() 判断File对象对应的文件或目录是否存在,存在返回true
boolean delete() 删除File对象对应的文件或目录,成功删除返回true
boolean createNewFile() 当File对象对应的文件不存在时,该方法将新建一个文件,创建成功返回true
String getName() 返回file对象表示的文件名或文件夹名称
String getPath() 返回File对象对应的路径
String getAbsolutePath() 返回File对象的绝对路径
String getParent() 返回File对象对应目录的父目录(即返回的目录不包含最后一级目录)
boolean canRead() 判断File对象对应的文件或目录是否可读
boolean canWrite() 判断File对象对应的文件或目录是否可写
boolean isFile() 判断File对象对应的是否是文件
boolean isDirectory() 判断File对象对应的是否是目录
boolean isAbsolute() 判断File对象对应的文件或目录是否是绝对路径
long lastModified() 返回1970年1月1日0时0分0秒到文件最后修改时间的毫秒值
long length() 返回文件大小,单位:字节
String[] list() 列出指定目录的全部内容,只是列出名称
File[] listFiles() 返回一个包含了File对象所有子文件和子目录的File数组
boolean mkdir() 创建此对象的路径名指定的目录
boolean mkdirs() 创建此对象路径指定的目录,包含任何必需但不存在的父目录。

注意:
跨平台分隔符不同,建议使用File.pathSeparator,File.separator做路径分隔符和目录分隔符。
File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。
File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。

遍历目录下的文件

首先我们在D盘中创建一个临时文件夹,在文件夹中再添加一个文件夹,我们想要遍历临时文件夹中所有的内容,代码如下:

    public static void main(String[] args){
        //创建文件对象
        File file = new File("D:\\临时文件夹");
        //如果该文件是文件夹
        if (file.isDirectory()) {
            //调用list()方法获得该目录下所有文件的名称
            String[] names = file.list();
            //foreach循环,依次取出字符串数组names的值
            for (String name:names){
                System.out.println(name);
            }
        }
    }

文件过滤器

有时我们需要得到的是指定类型的文件,例如获取所有".java"文件。针对这种需求,File类中提供重载方法list(FilenameFilter filter)方法,该方法接收一个FilenameFilter类型的参数。FilenameFilter是一个接口,在调用list()方法时,需要实现文件过滤器FilenameFilter,并在accept()方法中做出判断,从而获得指定类型的文件。

下面我们通过案例演示如何遍历指定目录下所有扩展名为".txt"的文件:

    public static void main(String[] args) {
        //创建文件对象
        File file = new File("D:\\临时文件夹\\测试");

        //创建过滤器FilenameFilter对象,实现accept方法
        FilenameFilter filter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File currFile = new File(dir, name);
                if (currFile.isFile() && name.endsWith(".docx")) {
                    return true;
                }
                return false;
            }
        };
        //如果文件对象存在
        if (file.exists()) {
            String[] lists = file.list(filter);
            for (String name : lists) {
                System.out.println(name);
            }
        }
    }

为了让小伙伴们更容易理解过滤器的原理,下面分步骤分析:

  1. 取出File对象指定目录下的所有子目录和文件。
  2. 对于每个子目录或文件,都会调用accept(File dir,String name)方法。
  3. accept方法中新建一个File对象,将accept方法的参数传入创建File对象的构造方法中。
  4. 对currFile对象进行判断,如果返回true,将当前遍历的子目录或文件添加到字符串数组中。

通过递归遍历子目录下的文件

上述两个例子,我们只能遍历特定目录下的子目录和文件,如果我们想要遍历子目录中的文件,就需要使用递归。

递归方法代码如下:

    public static void fileDir(File dir){
        if (dir.isDirectory()){
            File[] files = dir.listFiles();

            for (File f :
                    files) {
                if (f.isDirectory()){
                    fileDir(f);
                }
                System.out.println(f.getName());
            }
        }
    }

程序入口代码如下:

    public static void main(String[] args) {
        //创建文件对象
        File file = new File("D:\\临时文件夹\\测试");

        fileDir(file);
    }

运行结果如下:

ReadMe.txt
新建 Microsoft PowerPoint 演示文稿.pptx
新建 Microsoft Word 文档.docx
新建 好压 7Z 压缩文件.7z
不倦.txt
新建文件夹

删除文件和目录

delete()方法常用于删除文件目录和文件。

如果我们直接删除一个非空的文件夹,则会返回false,delete()方法删除文件夹时,只有该文件夹为空时才能删除成功。

我们可以使用递归进行整个文件的删除。

代码示例如下:

    public static void delete(File dir){
        //判断File对象是否存在
        if (dir.exists()){
            File[] files = dir.listFiles();
            for (File f: files) {
                if (f.isDirectory()){
                    delete(f);
                }else {
                    f.delete();
                }
            }
            dir.delete();
        }
    }

自定义的静态方法delete中,

  1. 首先判断传入的的File对象是否为空。
  2. 如果不为空,通过listFiles()方法获得该File对象目录中的全部子目录和文件对象。
  3. 使用foreach循环将子目录和文件依次拿出,用File类型变量f存储。
  4. 如果f是目录,则递归调用该方法本身。
  5. 如果f是文件,则通过delete()方法直接删除。
  6. 当子目录的文件全部删除后,dir.delete()将父目录也删除,然后跳出该方法。直至全部的递归跳出。该目录及该目录下的文件都将删除。
posted on 2021-10-18 19:21  技术小伙伴  阅读(304)  评论(0)    收藏  举报