首页 > 编程笔记 > Java笔记 阅读:75

Java File文件操作类的用法(非常详细)

File 是 java.io 包中作为文件和目录的类。

对于目录,Java 把 File 类当作一种特殊类型的文件,即文件名单列表。File 类定义了一些与平台无关的方法来操作文件,通过调用 File 类中的方法不仅可以得到文件和目录的描述信息,包括名称、所在路径、读写性和长度等,还可以对文件和目录执行新建、删除及重命名等操作。

但是使用File类不能读取文件内容,操作文件内容需要使用输入流和输出流。

Java File类常用的方法

File 类用于封装一条路径,这条路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径。File 类内部封装的路径可以指向一个文件,也可以指向一个目录。

File 类的构造方法如下表所示:

表 1 File类的构造方法
方法声明 功能描述
File(String pathname) 构造方法,通过指定的字符串类型的文件路径来创建一个新的 File 对象
File(String parent, String child) 构造方法,根据指定的字符串类型的父路径和字符串类型的子路径(包括文件名称)创建一个 File 对象
File(File parent, String child) 构造方法,根据指定的 File 类的父路径和字符串类型的子路径(包括文件名称)创建一个 File 对象
File(URI uri) 构造方法,通过将给定的 file: URl 转换为抽象路径名来创建新的 File 对象

表中列举的所有的构造方法都需要传入文件路径。

通常,如果程序只处理一个目录或文件,并且知道该目录或文件路径,那么使用第一个构造方法比较方便。如果程序处理的是一个公共目录下的若干子目录或文件,那么使用第二个或第三个构造方法更方便。

下面演示如何使用 File 类的构造方法创建 File 对象。

【实例】创建 File 对象。
import java.io.File;
import java.io.IOException;
public class Demo {
    public static void main(String[] args) throws IOException {
        // 使用绝对路径创建 File 对象
        File f1 = new File("D:\\chapter\\a.txt");
        f1.createNewFile();
        // 使用相对路径创建 File 对象
        File f2 = new File("b.java");
        f2.createNewFile();
        System.out.println(f1);
        System.out.println(f2);
    }
}
运行结果为:

D:\chapter10\a.txt
b.java

关于路径分隔符需要注意的是,在创建对象时传入的路径使用了“\\”,这是因为在 Windows 操作系统中目录符号为反斜线“\”,但反斜线“\”在 Java 中是特殊字符,表示转义符,所以在使用反斜线“\”时,前面应该再添加一个反斜线。另外,目录符号还可以用正斜线“/”表示,如 D:/chapter/a.txt。

还需要注意的问题是,当创建一个 File 类的对象时,如果它代表的磁盘文件不存在,那么系统不会自动创建,必须调用 createNewFile() 方法来创建,如上述实例中的代码 f1.createNewFile() 和 f2.createNewFile()。

File 类提供了一系列方法,用于操作内部封装的路径指向的文件或目录。File 类常用的方法如下表所示。

表 2 File类常用的方法
方法声明 功能描述
boolean canRead() 判断 File 对象对应的文件或目录是否可读
boolean canWrite() 判断 File 对象对应的文件或目录是否可写
boolean createNewFile() 当 File 对象对应的文件不存在时,新建一个此 File 对象所指定的新文件,若创建成功则返回 true,否则返回 false
boolean delete() 删除 File 对象对应的文件或目录,若删除成功则返回 true,否则返回 false
boolean exists() 判断 File 对象对应的文件或目录是否存在
String getAbsolutePath() 返回 File 对象对应的绝对路径
String getName() 返回 File 对象表示的文件或目录的名称
String getParent() 返回 File 对象对应目录的父目录
String getPath() 返回 File 对象对应的路径
boolean isFile() 判断 File 对象对应的是否是文件
boolean isDirectory() 判断 File 对象对应的是否是目录
boolean isHidden() 判断 File 对象对应的文件或目录是否隐藏
long length() 返回文件内容的长度
String[] list() 返回字符串数组,列出指定目录的全部内容,只是列出名称
String[] list(FilenameFilter filter) 返回字符串数组,命名由此抽象路径名表示的目录下满足指定过滤器的文件和目录
long lastModified() 返回 1970 年 1 月 1 日 0 时 0 分 0 秒到文件最后修改时间的毫秒值
boolean mkdir() 根据当前对象生成一个由该对象指定的路径
boolean renameTo(File newName) 将当前文件名更名为给定文件的完整路径,返回值若为 true 则表示成功,若为 false 则表示失败

【实例】查看指定路径下已有文件的相应信息。
import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        // 创建 File 对象,表示一个文件
        File file1 = new File("hello.txt");
        // 磁盘上没有 hello.txt 文件,调用 createNewFile() 方法创建
        file1.createNewFile();
        // 获取文件名称
        System.out.println("文件名称:" + file1.getName());
        // 获取文件的绝对路径
        System.out.println("文件的绝对路径:" + file1.getAbsolutePath());
        // 获取文件的相对路径
        System.out.println("文件的相对路径:" + file1.getPath());
        // 获取文件的父路径
        System.out.println("文件的父路径:" + file1.getParent());
        // 得到文件的大小
        System.out.println("文件大小为:" + file1.length() + "bytes");
        // 判断文件是否可写
        System.out.println(file1.canWrite() ? "文件可写" : "文件不可写");
        // 判断文件是否可读
        System.out.println(file1.canRead() ? "文件可读" : "文件不可读");
        // 判断是否是一个文件
        System.out.println(file1.isFile() ? "是一个文件" : "不是一个文件");
        // 判断是否是一个目录
        System.out.println(file1.isDirectory() ? "是一个目录" : "不是一个目录");
        // 判断是否是绝对路径
        System.out.println(file1.isAbsolute() ? "是绝对路径" : "不是绝对路径");
        // 得到文件的最后修改时间
        System.out.println("最后修改时间为:" + file1.lastModified());
        // 是否成功删除文件
        System.out.println("是否成功删除文件:" + file1.delete());
    }
}
运行结果为:

标准输出:文件名称:hello.txt
文件的绝对路径:d:/chapter/hello.txt
文件的相对路径:hello.txt
文件的父路径:null
文件大小为:12bytes
文件可写
文件可读
是一个文件
不是一个目录
不是绝对路径
最后修改时间为:1741225405804
是否成功删除文件:true

File类遍历目录下的文件

File 类的常用方法中有一个 list() 方法,该方法用于遍历某个指定目录下的所有文件的名称。

需要注意的是,使用 list() 方法仅遍历指定目录下一级目录或文件的名称,不会再向下遍历二级目录中的内容。

【实例】使用 list() 方法对指定目录进行遍历,显示所有文件的名称。
import java.io.File;

public class Main {
    public static void main(String[] args) {
        File file = new File("D:\\chapter");
        if (file.isDirectory()) {
            // 获得目录下所有文件的文件名
            String[] filenames = file.list();
            for (String name : filenames) {
                // 输出文件名
                System.out.println(name);
            }
        }
    }
}
运行结果为:

.idea
b.java
chapter.iml
hello.txt
out
src

实例实现了遍历一个目录下所有文件的功能,但有些应用程序只是需要得到指定类型的文件,对于这样的需求,File 类提供了重载的 list(FilenameFilter filter) 方法,该方法中的参数传递的就是过滤器。

FilenameFilter 是一个接口,被称为文件过滤器。该接口中定义了抽象方法 boolean accept(File dir, String name)。在调用 list() 方法时,需要实现文件过滤器接口 FilenameFilter,并在 accept() 方法中做出判断,获得指定类型的文件。

【实例】遍历指定目录下指定类型的文件,列出所有满足条件的文件名称。
import java.io.File;
import java.io.FilenameFilter;

public class Main {
    public static void main(String[] args) {
        // 创建 File 对象
        File file = new File("D:\\chapter10");

        // 创建文件过滤器对象
        FilenameFilter filter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File currentfile = new File(dir, name);
                // 自定义过滤规则
                // 若文件名扩展名为 .txt,则返回 true,否则返回 false
                if (currentfile.isFile() && name.endsWith(".txt")) {
                    return true;
                } else {
                    return false;
                }
            }
        };

        // 判断目录是否存在
        if (file.exists()) {
            String[] lists = file.list(filter);
            System.out.println("D:\\chapter 目录下所有 .txt 文件有:");
            for (String name : lists) {
                System.out.println(name);
            }
        }
    }
}
运行结果如下图所示:

D:\\chapter 目录下所有 .txt 文件有:
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
a.txt

注意,java.io 包中还有一个文件过滤器接口,即 FileFilter 接口,请读者自行查阅资料学习。两个过滤器接口是没有实现类的,需要开发者声明接口的实现类,重写过滤的方法 accept(),并在该方法中自定义过滤的规则。

File类删除文件及目录

在操作文件时,经常会遇到删除一个目录下的某个文件或删除整个目录的情况,这需要使用 File 类的 delete() 方法。

下面通过实例来介绍 delete() 方法的应用。先在计算机的 D 盘的 chapter 文件夹中创建一个文本文件,如 a.txt。

【实例】使用 File 类的 delete() 方法删除指定的文件夹。
import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File file = new File("D:\\chapter");
        if (file.exists()) {
            System.out.println(file.delete());
        }
    }
}
运行结果为:

false

由运行结果可知,输出信息为 false,也就是说,并没有删除指定文件夹D:\\chapter。这是因为,如果 File 对象代表的是目录,并且该目录下包含子目录或文件,那么使用 delete() 方法无法删除这个目录。

要解决这个问题,需要采用递归方式将整个目录及其中的文件全部删除,并删除所在的目录。对上面的实例进行修改,实现删除包含子文件的目录。

【实例】采用递归方式将整个目录及其中的文件全部删除。
import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File file = new File("D:\\chapter");
        deletedir(file);
    }

    public static void deletedir(File dir) {
        // 判断传入的对象 dir 是否存在
        if (dir.exists()) {
            // 得到 File 数组
            File[] files = dir.listFiles();
            for (File file : files) {
                // 如果是目录,那么递归调用 deletedir() 方法
                if (file.isDirectory()) {
                    deletedir(file);
                } else {
                    // 如果是文件,不是目录,那么直接删除
                    file.delete();
                }
            }
            dir.delete();
        }
    }
}
运行结果是成功地删除了 chapter 文件夹。

相关文章