Java File类的用法(非常详细)
Java 的 File 类可以用于处理文件目录。在对一个文件进行输入/输出时,必须先获取有关该文件的基本信息,如文件是否可以读取、能否被写入、路径是什么等。
java.io.File 类不属于 Java 流系统,但它是文件流进行文件操作的辅助类,提供了获取文件基本信息以及操作文件的一些方法,通过调用 File 类提供的相应方法,能够完成创建文件、删除文件以及对目录的一些操作。
File 类的对象一旦创建,就不能再修改。要创建一个新的 File 对象,需要使用它的构造方法,如下表所示:
使用上表所列的哪种构造方法要由其他被访问的文件来决定。例如,当在应用程序中只用到一个文件时,使用第 1 种构造方法最合适;如果使用了一个公共目录下的几个文件,那么使用第 2 种或第 3 种构造方法会更方便。
创建 File 类的对象后,就可以使用 File 类的相关方法来获取文件信息。接下来,先了解一下 File 类的常用方法,如下表所示。
接下来,通过一个案例来演示 File 类常用方法的基本使用,先在当前目录创建一个 txt.txt 文件,在里面输入“C语言中文网欢迎您!”。
在第 18~20 行代码中,通过格式化时间信息,获取文件最后修改时间,最后打印文件 demo.txt 相关属性的信息。
File 类中提供了 list() 方法和 listFiles() 方法,用来遍历目录下的所有文件。两者不同之处是 list() 方法只返回文件名,没有路径信息;而 listFiles() 方法不但返回文件名称,还包含路径信息。
接下来,通过案例来演示 list() 方法与 listFiles() 方法的使用:
通过程序运行结果可以看到,listFiles() 方法输出的信息比 list() 方法输出的信息更加详细,而且 listFiles() 方法返回值是 File 类型,可以直接使用该文件。
注意,在 Windows 系统中,目录的分隔符是反斜杠(\)。但是,在 Java 语言中,使用反斜杠表示转义字符,所以如果需要在 Windows 系统的路径下包括反斜杠,则应该使用两条反斜杠,如 D:\\javaCode 或者直接用斜杠(/)也可以。
接下来,通过案例来演示如何删除文件及目录:
第 18~23 行代码增加了确保程序健壮性的异常处理。
注意,File 类的 delete() 方法只是删除一个指定的文件,如果目录下还有子目录,是无法直接删除的,需要递归删除。另外,在 Java 中是直接从虚拟机中将文件或目录删除,可以不经过回收站,文件无法恢复,所以使用 delete() 操作时要谨慎。
java.io.File 类不属于 Java 流系统,但它是文件流进行文件操作的辅助类,提供了获取文件基本信息以及操作文件的一些方法,通过调用 File 类提供的相应方法,能够完成创建文件、删除文件以及对目录的一些操作。
Java File类及其常用方法
File 类的对象是一个“文件或目录”的抽象,它并不打开文件或目录,而是指定要操作的文件或目录。File 类的对象一旦创建,就不能再修改。要创建一个新的 File 对象,需要使用它的构造方法,如下表所示:
构造方法 | 方法描述 |
---|---|
public File(String filename) | 创建 File 对象,filename 表示文件或目录的路径 |
public File(String parent, String child) | 创建 File 对象,parent 表示上级目录,child 表示指定的子目录或文件名 |
public File(File obj, String child) | 创建 File 对象,obj 表示 File 对象,child 表示指定的子目录或文件名 |
使用上表所列的哪种构造方法要由其他被访问的文件来决定。例如,当在应用程序中只用到一个文件时,使用第 1 种构造方法最合适;如果使用了一个公共目录下的几个文件,那么使用第 2 种或第 3 种构造方法会更方便。
创建 File 类的对象后,就可以使用 File 类的相关方法来获取文件信息。接下来,先了解一下 File 类的常用方法,如下表所示。
方法 | 方法描述 | 备注 |
---|---|---|
String getName() | 获取相关文件名 | 与文件名相关的方法 |
String getPath() | 获取文件路径 | |
String getAbsolutePath() | 获取文件绝对路径 | |
String getParent() | 获取文件上级目录名称 | |
boolean renameTo(File newName) | 更改文件名,成功则返回 true,否则返回 false | |
boolean exists() | 检测文件对象是否存在 | 文件检测相关方法 |
boolean canWrite() | 检测文件对象是否可写 | |
boolean canRead() | 检测文件对象是否可读 | |
boolean isFile() | 检测文件对象是否是文件 | |
boolean isDirectory() | 检测文件对象是否是目录 | |
boolean isAbsolute() | 检测文件对象是否是绝对路径 | |
long lastModified() | 返回此 File 对象表示的文件或目录最后一次被修改的时间 | 文件常用属性相关方法 |
long length() | 返回此 File 对象表示的文件或目录的长度 | |
boolean delete() | 删除文件或目录。如果 File 对象为目录,则该目录为空,方可删除。删除成功,返回 true,否则返回 false | |
boolean mkdir() | 创建 File 对象指定目录。如果创建成功,则返回 true,否则返回 false | 目录相关方法 |
boolean mkdirs() | 创建 File 对象指定的目录,如果此目录的父级不存在,则还会创建父目录。如创建成功,则返回 true,否则返回 false | |
String[] list() | 返回此 File 对象表示的目录中的文件和目录的名称所组成的字符串数组 |
接下来,通过一个案例来演示 File 类常用方法的基本使用,先在当前目录创建一个 txt.txt 文件,在里面输入“C语言中文网欢迎您!”。
import java.io.*; import java.util.*; import java.text.SimpleDateFormat; public class Demo { public static void main(String[] args) { File file = new File("src/demo.txt"); System.out.println("文件是否存在-->" + file.exists()); System.out.println("文件是否可写-->" + file.canWrite()); System.out.println("文件是否可读-->" + file.canRead()); System.out.println("文件是否是文件-->" + file.isFile()); System.out.println("文件是否是目录-->" + file.isDirectory()); System.out.println("文件是否是绝对路径-->" + file.isAbsolute()); System.out.println("文件名是-->" + file.getName()); System.out.println("文件的路径是-->" + file.getPath()); System.out.println("文件的绝对路径是-->" + file.getAbsolutePath()); System.out.println("文件的上级路径是-->" + file.getParent()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.print("最后修改时间-->"); System.out.println(sdf.format(new Date(file.lastModified()))); System.out.println("文件长度是-->" + file.length()); } }程序的运行结果如下:
文件是否存在-->true 文件是否可写-->true 文件是否可读-->true 文件是否是文件-->true 文件是否是目录-->false 文件是否是绝对路径-->false 文件名是-->txt.txt 文件的路径是-->src\demo.txt 文件的绝对路径是-->D:\src\demo.txt 文件的上级路径是-->src 最后修改时间-->2025-03-15 文件长度是-->26程序中,在程序中构造了 File 类的对象,运用 File 类的各个方法得到文件的各种相关属性。
在第 18~20 行代码中,通过格式化时间信息,获取文件最后修改时间,最后打印文件 demo.txt 相关属性的信息。
Java遍历目录下的文件
File 类用来操作文件和获得文件的信息,但是不提供对文件读取的方法,这些方法由文件流提供。File 类中提供了 list() 方法和 listFiles() 方法,用来遍历目录下的所有文件。两者不同之处是 list() 方法只返回文件名,没有路径信息;而 listFiles() 方法不但返回文件名称,还包含路径信息。
接下来,通过案例来演示 list() 方法与 listFiles() 方法的使用:
import java.io.*; public class Demo { public static void main(String[] args) { System.out.printf("-----------list()方法-----------\n"); File file = new File("D:\\javaCode"); // 创建File对象 if (file.isDirectory()) { // 判断file目录是否存在 String[] list = file.list(); // 打印文件名 for (String fileName : list) { System.out.println(fileName); } } System.out.printf("-----------listFiles()方法-----------\n"); files(file); } public static void files(File file) { File[] listFile = file.listFiles(); // 遍历目录下所有文件 for (File f : listFile) { if (f.isDirectory()) { // 判断是否是目录 files(f); // 递归调用 } System.out.println(f.getAbsolutePath()); } } }程序的运行结果如下:
------------------list()方法------------------- javaDemo demo.txt ----------------listFiles()方法---------------- D:\javaCode\.idea\.gitignore D:\javaCode\.idea\misc.xml D:\javaCode\.idea\modules.xml D:\javaCode\.idea\uiDesigner.xml D:\javaCode\.idea\workspace.xml D:\javaCode\.idea D:\javaCode\chapter02.iml D:\javaCode\out\production\chapter\Demo02.class程序中:
- 首先创建 File 对象,指定 File 对象的目录;
- 第 7~12 行代码先判断 file 目录是否存在,若存在,则调用 list() 方法;
- 第 8 行代码以 String 数组的形式得到所有文件名,最后循环遍历数组内容并打印。如果目录下仍然有子目录则不能遍历到,此时就需要用到 File 类的 listFiles() 方法,遍历目录下所有文件之后,判断循环遍历到的是否是目录,如果是目录,则再次递归调用 files(file) 方法本身,直到遍历完所有文件。
- 第 17~25 行代码是自定义的静态方法。
通过程序运行结果可以看到,listFiles() 方法输出的信息比 list() 方法输出的信息更加详细,而且 listFiles() 方法返回值是 File 类型,可以直接使用该文件。
注意,在 Windows 系统中,目录的分隔符是反斜杠(\)。但是,在 Java 语言中,使用反斜杠表示转义字符,所以如果需要在 Windows 系统的路径下包括反斜杠,则应该使用两条反斜杠,如 D:\\javaCode 或者直接用斜杠(/)也可以。
Java File删除文件及目录
在程序设计中,除了遍历文件外,文件的删除操作也很常见,Java 中通过使用 File 类的 delete() 方法来对文件进行删除操作。接下来,通过案例来演示如何删除文件及目录:
import java.io.*; public class Demo { public static void main(String[] args) { String path = "D:/javaCode/chapter02/out"; deleteD(path); } private static void deleteD(String pp) { File file = new File(pp); if (file.isFile()) { while (file.exists()) { System.out.println("删除了文件:" + file.getName()); file.delete(); } } else { File[] listFiles = file.listFiles(); for (File file2 : listFiles) { try { deleteD(file2.getAbsolutePath()); } catch (Exception e) { System.out.println(e.getMessage()); } } file.delete(); } } }程序的运行结果如下:
删除了文件:Demo02.class 删除了文件:Demo0201.class 删除了文件:Demo0202.class 删除了文件:Demo03.class 删除了文件:Demo05.class 删除了文件:Demo06.class在 main() 方法中,deleteD(File file) 方法中将待删除的内容以字符串形式传入。调用方法时创建 File 对象,然后遍历该目录下所有文件,判断遍历到的是否是目录:
- 如果是目录,继续递归调用方法本身;
- 如果是文件则输出文件信息然后直接删除,删除文件完成后,将目录删除。
第 18~23 行代码增加了确保程序健壮性的异常处理。
注意,File 类的 delete() 方法只是删除一个指定的文件,如果目录下还有子目录,是无法直接删除的,需要递归删除。另外,在 Java 中是直接从虚拟机中将文件或目录删除,可以不经过回收站,文件无法恢复,所以使用 delete() 操作时要谨慎。