Java File文件操作类的用法(非常详细)
File 是 java.io 包中作为文件和目录的类。
对于目录,Java 把 File 类当作一种特殊类型的文件,即文件名单列表。File 类定义了一些与平台无关的方法来操作文件,通过调用 File 类中的方法不仅可以得到文件和目录的描述信息,包括名称、所在路径、读写性和长度等,还可以对文件和目录执行新建、删除及重命名等操作。
但是使用File类不能读取文件内容,操作文件内容需要使用输入流和输出流。
File 类的构造方法如下表所示:
表中列举的所有的构造方法都需要传入文件路径。
通常,如果程序只处理一个目录或文件,并且知道该目录或文件路径,那么使用第一个构造方法比较方便。如果程序处理的是一个公共目录下的若干子目录或文件,那么使用第二个或第三个构造方法更方便。
下面演示如何使用 File 类的构造方法创建 File 对象。
【实例】创建 File 对象。
还需要注意的问题是,当创建一个 File 类的对象时,如果它代表的磁盘文件不存在,那么系统不会自动创建,必须调用 createNewFile() 方法来创建,如上述实例中的代码 f1.createNewFile() 和 f2.createNewFile()。
File 类提供了一系列方法,用于操作内部封装的路径指向的文件或目录。File 类常用的方法如下表所示。
【实例】查看指定路径下已有文件的相应信息。
需要注意的是,使用 list() 方法仅遍历指定目录下一级目录或文件的名称,不会再向下遍历二级目录中的内容。
【实例】使用 list() 方法对指定目录进行遍历,显示所有文件的名称。
FilenameFilter 是一个接口,被称为文件过滤器。该接口中定义了抽象方法 boolean accept(File dir, String name)。在调用 list() 方法时,需要实现文件过滤器接口 FilenameFilter,并在 accept() 方法中做出判断,获得指定类型的文件。
【实例】遍历指定目录下指定类型的文件,列出所有满足条件的文件名称。
下面通过实例来介绍 delete() 方法的应用。先在计算机的 D 盘的 chapter 文件夹中创建一个文本文件,如 a.txt。
【实例】使用 File 类的 delete() 方法删除指定的文件夹。
要解决这个问题,需要采用递归方式将整个目录及其中的文件全部删除,并删除所在的目录。对上面的实例进行修改,实现删除包含子文件的目录。
【实例】采用递归方式将整个目录及其中的文件全部删除。
对于目录,Java 把 File 类当作一种特殊类型的文件,即文件名单列表。File 类定义了一些与平台无关的方法来操作文件,通过调用 File 类中的方法不仅可以得到文件和目录的描述信息,包括名称、所在路径、读写性和长度等,还可以对文件和目录执行新建、删除及重命名等操作。
但是使用File类不能读取文件内容,操作文件内容需要使用输入流和输出流。
Java File类常用的方法
File 类用于封装一条路径,这条路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径。File 类内部封装的路径可以指向一个文件,也可以指向一个目录。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
还需要注意的问题是,当创建一个 File 类的对象时,如果它代表的磁盘文件不存在,那么系统不会自动创建,必须调用 createNewFile() 方法来创建,如上述实例中的代码 f1.createNewFile() 和 f2.createNewFile()。
File 类提供了一系列方法,用于操作内部封装的路径指向的文件或目录。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
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
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 文件夹。