一.概述
java.io.File
类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建,查找,删除,判断等操作。
二.构造方法
File类常用的构造方法有以下几个:
public File(File parent, String child)
:根据 parent 抽象路径名和 child 路径名字符串创建一个新File
实例。public File(String pathname)
:通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。public File(String parent, String child)
:根据parent路径字符串和child路径名字符串创建一个新File实例。
使用举例:
import java.io.File;
public class TestFile {
public static void main(String[] args) {
// public File(File parent, String child):
// 根据 parent 抽象路径名和 child 路径名字符串创建一个新 `File` 实例。
File parent = new File("D:\\abc");
String child = "a.txt";
File f1 = new File(parent, child);
// public File(String pathname):
// 通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。
String pathname = "D:\\abc\b.txt";
File f2 = new File(pathname);
// public File(String parent, String child):
// 根据parent路径字符串和child路径名字符串创建一个新File实例。
String p = "D:\\abc";
String c = "c.txt";
File f3 = new File(p, c);
}
}
注意:
无论指定路径下的文件或者目录是否存在,都不会影响File对象的创建。
三. 常用方法
-
获取功能的方法
public String getAbsolutePath()
:返回File的绝对路径名字符串。public String getPath()
:将File转换为一个路径名字符串。public String getName()
:返回由此File表示的文件或目录的名称。public long length()
:返回File表示的文件的长度。
import java.io.File; public class TestFile { public static void main(String[] args) { File f = new File("D:\\abc\\test.txt"); System.out.println("文件绝对路径是:" + f.getAbsolutePath()); System.out.println("文件路径是:" + f.getPath()); System.out.println("文件名称是:" + f.getName()); System.out.println("文件长度是:" + f.length()); System.out.println("--------------------------------"); File f1 = new File("D:\\abc"); System.out.println("目录绝对路径是:" + f1.getAbsolutePath()); System.out.println("目录路径是:" + f1.getPath()); System.out.println("目录名称是:" + f1.getName()); System.out.println("目录长度是:" + f1.length()); } }
输出信息:
$ java TestFile 文件绝对路径是:D:\abc\test.txt 文件路径是:D:\abc\test.txt 文件名称是:test.txt 文件长度是:425 -------------------------------- 目录绝对路径是:D:\abc 目录路径是:D:\abc 目录名称是:abc 目录长度是:0
注意:
-
length()是获取文件的长度,对于目录,是没有长度概念的。
-
绝对路径是指从盘符开始的,一个完整的路径。
-
相对路径是指相对于当前目录的路径。
-
对于路径字符串中的分隔符,不同系统有不同的表达方式,比如windows是\,Linux是/,为了跨平台,可以使用
File.separator
来表示,它会根据系统使用对应的分隔符。比如:
D:\abc
, 可以使用"D:" + File.separator + "abc"
-
判断相关的方法
public boolean exists()
:测试File表示的文件或目录是否存在public boolean isDirectory()
:测试File表示的文件是否是一个目录public boolean isFile()
:测试File表示的文件是否是一个标准文件
import java.io.File; public class TestFile { public static void main(String[] args) { File f = new File("D:\\abc\\test.txt"); File f1 = new File("D:\\abc"); // 判断是否存在 System.out.println("D:\\abc\\test.txt是否存在? ==> " + f.exists()); System.out.println("D:\\abc是否存在? ==> " + f1.exists()); // 判断是否是文件 System.out.println("D:\\abc\\test.txt是文件? ==> " + f.isFile()); System.out.println("D:\\abc是文件? ==> " + f1.isFile()); // 判断是否是目录 System.out.println("D:\\abc\\test.txt是目录? ==> " + f.isDirectory()); System.out.println("D:\\abc是目录? ==> " + f1.isDirectory()); } }
输出信息:
$ java TestFile D:\abc\test.txt是否存在? ==> true D:\abc是否存在? ==> true D:\abc\test.txt是文件? ==> true D:\abc是文件? ==> false D:\abc\test.txt是目录? ==> false D:\abc是目录? ==> true
-
新建和删除功能
public boolean createNewFile()
:当且仅当不存在File指定名称的文件时,创建一个新的空文件。public boolean delete()
:删除此File表示的文件或目录。public boolean mkdir()
:创建此File指定的目录。public boolean mkdirs()
:创建此File指定的目录,包括所有必需但不存在的父目录。
import java.io.File; import java.io.IOException; public class TestFile { public static void main(String[] args) throws IOException{ // 创建文件 File newFile = new File("newFile.txt"); System.out.println("newFile.txt存在? ==> " + newFile.exists()); System.out.println("创建newFile.txt是否成功? ==> " + newFile.createNewFile()); System.out.println("newFile.txt存在? ==> " + newFile.exists()); System.out.println("=====================\r\n"); // 创建单级目录 File newDir = new File("newDir"); System.out.println("newDir存在? ==> " + newDir.exists()); System.out.println("创建newDir是否成功? ==> " + newDir.mkdir()); System.out.println("newDir存在? ==> " + newDir.exists()); System.out.println("=====================\r\n"); // 创建多级目录 File newDirs = new File("newDirs\\aaa"); System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists()); System.out.println("创建newDirs\\aaa是否成功? ==> " + newDirs.mkdirs()); System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists()); // 删除文件 System.out.println("删除文件: " + newFile.delete()); // 删除目录 System.out.println("删除目录: " + newDir.delete()); System.out.println("删除不为空的目录: " + newDirs.delete()); } }
输出信息:
$ java TestFile newFile.txt存在? ==> false 创建newFile.txt是否成功? ==> true newFile.txt存在? ==> true ===================== newDir存在? ==> false 创建newDir是否成功? ==> true newDir存在? ==> true ===================== newDirs\aaa存在? ==> true 创建newDirs\aaa是否成功? ==> false newDirs\aaa存在? ==> true 删除文件: true 删除目录: true 删除不为空的目录: true
注意:
- 删除多级目录时候,不会整个目录级删除,只会删除最内层的非空目录。
- 目录非空时,无法被删除。
-
遍历目录方法
-
public String[] list()
:返回一个String数组,数组元素表示该File目录中所有子文件或目录名字 -
public File[] listFiles()
:返回一个File数组,数组元素表示该目录总所有的子文件或目录
比如当前目录下有一文件夹Dir,里面有文件a.txt,b.txt,d.txt,以及文件夹c
import java.io.File; import java.io.IOException; public class TestFile { public static void main(String[] args) throws IOException{ // 当前路径下的Dir目录 File f = new File("Dir"); // public String[] list() String[] names; names = f.list(); // 遍历files for (String name : names) { System.out.println(name); } } } // 输出信息 a.txt b.txt c d.txt
import java.io.File; import java.io.IOException; public class TestFile { public static void main(String[] args) throws IOException{ // 当前路径下的Dir目录 File dir = new File("Dir"); // public File[] listFiles() File[] files; files = dir.listFiles(); for (File f : files) { System.out.println(f.getName()); } } } // 输出信息 a.txt b.txt c d.txt
注意:
使用listFiles方法的File对象,其所表示的目录必须是实际存在的,否则无法遍历,报NullPointerException异常。
-
-
带过滤器的遍历目录方法
File[] listFiles(FileFilter filter)
:返回抽象路径名数组,这些路径名表示此File表示的目录中满足指定过滤器的文件和目录。
说明:
java.io.FileFilter
是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数。 接口中只有一个方法:
boolean accept(File pathname)
:测试指定pathname是否应该包含在当前File目录中,符合就返回true。 通过过滤器的作用,listFiles()返回的数组元素中,子文件对象都是符合过滤条件的。
举例:查找目录Dir下,以.java结尾的文件,打印文件名字
目录如下图:
import java.io.*; public class TestFileFilter { public static void main(String[] args) { File dirs = new File("Dir"); File[] files = dirs.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.getName().endsWith(".java"); } }); // 打印文件名字 for (File f : files) { System.out.println(f.getName()); } } }
输出:
$ java TestFileFilter Consumer.java Ticket.java
通过之前所学Lambda,发现上面的FileFilter接口满足只有一个接口的条件,可以使用Lambda优化,如下为优化代码:
import java.io.*; public class TestFileFilter { public static void main(String[] args) { File dirs = new File("Dir"); // File[] files = dirs.listFiles(new FileFilter() { // public boolean accept(File pathname) { // return pathname.getName().endsWith(".java"); // } // }); // 使用Lambda优化 File[] files = dirs.listFiles(pathname -> pathname.getName().endsWith("java")); // 打印文件名字 for (File f : files) { System.out.println(f.getName()); } } }
四. 综合例子
实现文件搜索:搜索指定目录下的.java文件
分析:
- 目录搜索,无法判断多少级目录,需要使用递归遍历所有目录。
- 遍历目录时,获取到的子文件,通过文件名字判断是否满足条件
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
File dir = new File("Dir");
search(dir);
}
public static void search(File dirs) {
File[] files = dirs.listFiles(p -> p.getName().endsWith(".java") || p.isDirectory());
// 循环打印
for (File f : files) {
// 如果是文件,则打印
if (f.isFile()) {
System.out.println(f.getName());
}
else { // 是目录,则递归查找
search(f);
}
}
}
}