Java File list() 方法
File.list()
是 Java 中 java.io.File
类提供的一个实例方法,用于获取指定目录下的所有文件和子目录的名称列表。这个方法对于需要遍历或处理目录内容的场景非常有用。
方法语法
public String[] list()
方法返回值
list()
方法返回一个字符串数组(String[]
),包含以下内容:
- 如果调用对象代表一个有效目录,则返回该目录下所有文件和子目录的名称
- 如果调用对象不代表目录或发生 I/O 错误,则返回
null
- 如果目录为空,则返回一个空数组
基本用法示例
实例
import java.io.File;
public class ListFilesExample {
public static void main(String[] args) {
// 创建一个代表目录的 File 对象
File directory = new File("C:/MyFolder");
// 获取目录下的文件和子目录列表
String[] files = directory.list();
// 检查是否成功获取列表
if (files != null) {
System.out.println("目录内容:");
for (String file : files) {
System.out.println(file);
}
} else {
System.out.println("指定的路径不是一个目录或发生错误");
}
}
}
public class ListFilesExample {
public static void main(String[] args) {
// 创建一个代表目录的 File 对象
File directory = new File("C:/MyFolder");
// 获取目录下的文件和子目录列表
String[] files = directory.list();
// 检查是否成功获取列表
if (files != null) {
System.out.println("目录内容:");
for (String file : files) {
System.out.println(file);
}
} else {
System.out.println("指定的路径不是一个目录或发生错误");
}
}
}
方法重载版本
File
类还提供了另一个版本的 list()
方法,可以接受一个过滤器:
实例
public String[] list(FilenameFilter filter)
FilenameFilter 接口
FilenameFilter
是一个函数式接口,只包含一个方法:
实例
boolean accept(File dir, String name)
使用过滤器示例
实例
import java.io.File;
import java.io.FilenameFilter;
public class FilteredListExample {
public static void main(String[] args) {
File directory = new File("C:/MyFolder");
// 只列出 .txt 文件
String[] textFiles = directory.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
// Java 8+ 可以使用 Lambda 表达式简写
String[] textFiles = directory.list((dir, name) -> name.endsWith(".txt"));
if (textFiles != null) {
System.out.println("文本文件列表:");
for (String file : textFiles) {
System.out.println(file);
}
}
}
}
import java.io.FilenameFilter;
public class FilteredListExample {
public static void main(String[] args) {
File directory = new File("C:/MyFolder");
// 只列出 .txt 文件
String[] textFiles = directory.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
// Java 8+ 可以使用 Lambda 表达式简写
String[] textFiles = directory.list((dir, name) -> name.endsWith(".txt"));
if (textFiles != null) {
System.out.println("文本文件列表:");
for (String file : textFiles) {
System.out.println(file);
}
}
}
}
注意事项
- 权限问题:如果程序没有读取目录的权限,
list()
方法会返回null
- 符号链接:
list()
方法会跟随符号链接,可能返回链接指向的实际文件/目录名 - 性能考虑:对于包含大量文件的目录,
list()
方法可能会消耗较多内存 - 相对路径:返回的文件名仅包含名称部分,不包含完整路径
替代方法
在 Java 7 及以上版本,推荐使用 Files
类和 DirectoryStream
来处理目录内容,它们提供了更现代和灵活的方式:
实例
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class NioListExample {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("C:/MyFolder");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
}
}
}
import java.nio.file.Path;
import java.nio.file.Paths;
public class NioListExample {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("C:/MyFolder");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
}
}
}
总结
File.list()
方法是一个简单直接的目录内容获取方式,适合简单的文件系统操作。对于更复杂的需求,可以考虑使用 FilenameFilter
或转向 NIO.2 API 提供的更强大功能。
点我分享笔记