Java File listFiles() 方法

Java File Java File


listFiles() 方法是 Java 中 java.io.File 类提供的一个重要方法,用于获取当前目录下的所有文件和子目录。该方法返回一个 File 对象数组,每个 File 对象代表目录中的一个文件或子目录。

方法语法

listFiles() 方法有以下几种重载形式:

public File[] listFiles()
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());
            }
        }
    }
}

方法参数

FilenameFilter 接口

FilenameFilter 是一个函数式接口,用于过滤文件名:

实例

File[] listFiles(FilenameFilter filter)

示例:只列出 .txt 文件

实例

File directory = new File("C:/example");
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);

注意事项

  1. 空指针检查:如果 File 对象不是目录或没有读取权限,listFiles() 会返回 null,因此需要检查返回值。

  2. 性能考虑:对于包含大量文件的目录,listFiles() 可能会消耗较多内存,因为它会一次性加载所有文件信息。

  3. 排序问题:返回的文件数组不保证任何特定的顺序,如果需要排序,可以手动对数组进行排序。

  4. 符号链接:在 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"));
    }
}

使用 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);
    }
}

替代方案

在 Java 7 及以上版本,可以考虑使用 java.nio.file 包中的 FilesPath 类,它们提供了更现代的文件操作方式:

实例

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);
        }
    }
}

总结

listFiles() 方法是 Java 文件操作中的基础工具,掌握它的使用对于文件处理非常重要。在实际开发中,根据具体需求选择合适的过滤方式,并注意处理可能的异常情况。对于新项目,建议考虑使用 Java NIO 的 Files 类,它提供了更强大和灵活的文件操作功能。

Java File Java File