Java File listFiles() 方法
listFiles()
方法是 Java 中 java.io.File
类提供的一个重要方法,用于获取当前目录下的所有文件和子目录。该方法返回一个 File
对象数组,每个 File
对象代表目录中的一个文件或子目录。
方法语法
listFiles()
方法有以下几种重载形式:
public File[] listFiles()
public File[] listFiles(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
public File[] listFiles(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
基础用法
获取目录下所有文件和子目录
最基本的用法是不带任何参数,直接调用 listFiles()
方法:
实例
import java.io.File;
public class ListFilesExample {
public static void main(String[] args) {
// 创建一个 File 对象表示目录
File directory = new File("C:/example");
// 获取目录下所有文件和子目录
File[] files = directory.listFiles();
// 遍历并打印文件名
if (files != null) {
for (File file : files) {
System.out.println(file.getName());
}
}
}
}
public class ListFilesExample {
public static void main(String[] args) {
// 创建一个 File 对象表示目录
File directory = new File("C:/example");
// 获取目录下所有文件和子目录
File[] files = directory.listFiles();
// 遍历并打印文件名
if (files != null) {
for (File file : files) {
System.out.println(file.getName());
}
}
}
}
方法参数
FilenameFilter 接口
FilenameFilter
是一个函数式接口,用于过滤文件名:
实例
File[] listFiles(FilenameFilter filter)
示例:只列出 .txt
文件
实例
File directory = new File("C:/example");
File[] textFiles = directory.listFiles((dir, name) -> name.endsWith(".txt"));
File[] textFiles = directory.listFiles((dir, name) -> name.endsWith(".txt"));
FileFilter 接口
FileFilter
也是一个函数式接口,但它是基于 File
对象进行过滤:
实例
File[] listFiles(FileFilter filter)
示例:只列出目录
实例
File directory = new File("C:/example");
File[] subDirectories = directory.listFiles(File::isDirectory);
File[] subDirectories = directory.listFiles(File::isDirectory);
注意事项
空指针检查:如果
File
对象不是目录或没有读取权限,listFiles()
会返回null
,因此需要检查返回值。性能考虑:对于包含大量文件的目录,
listFiles()
可能会消耗较多内存,因为它会一次性加载所有文件信息。排序问题:返回的文件数组不保证任何特定的顺序,如果需要排序,可以手动对数组进行排序。
符号链接:在 Unix/Linux 系统中,
listFiles()
会跟随符号链接。
实际应用示例
递归列出所有文件
实例
import java.io.File;
public class RecursiveFileListing {
public static void listFilesRecursively(File directory) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
listFilesRecursively(file);
} else {
System.out.println(file.getAbsolutePath());
}
}
}
}
public static void main(String[] args) {
listFilesRecursively(new File("C:/example"));
}
}
public class RecursiveFileListing {
public static void listFilesRecursively(File directory) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
listFilesRecursively(file);
} else {
System.out.println(file.getAbsolutePath());
}
}
}
}
public static void main(String[] args) {
listFilesRecursively(new File("C:/example"));
}
}
使用 Java 8 Stream API
实例
import java.io.File;
import java.util.Arrays;
import java.util.stream.Stream;
public class FileStreamExample {
public static void main(String[] args) {
File directory = new File("C:/example");
// 使用 Stream 处理文件
Stream.of(directory.listFiles())
.filter(File::isFile)
.map(File::getName)
.forEach(System.out::println);
}
}
import java.util.Arrays;
import java.util.stream.Stream;
public class FileStreamExample {
public static void main(String[] args) {
File directory = new File("C:/example");
// 使用 Stream 处理文件
Stream.of(directory.listFiles())
.filter(File::isFile)
.map(File::getName)
.forEach(System.out::println);
}
}
替代方案
在 Java 7 及以上版本,可以考虑使用 java.nio.file
包中的 Files
和 Path
类,它们提供了更现代的文件操作方式:
实例
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class NioFileListing {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.filter(Files::isRegularFile)
.map(Path::getFileName)
.forEach(System.out::println);
}
}
}
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class NioFileListing {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.filter(Files::isRegularFile)
.map(Path::getFileName)
.forEach(System.out::println);
}
}
}
总结
listFiles()
方法是 Java 文件操作中的基础工具,掌握它的使用对于文件处理非常重要。在实际开发中,根据具体需求选择合适的过滤方式,并注意处理可能的异常情况。对于新项目,建议考虑使用 Java NIO 的 Files
类,它提供了更强大和灵活的文件操作功能。
点我分享笔记