ZetCode

Java 列出目录内容

上次修改时间:2024 年 5 月 11 日

本文提供了关于如何在 Java 中显示目录内容的全面、循序渐进的指南。掌握目录操作对于桌面和服务器应用程序中的高效文件管理、导航和自动化至关重要。通过学习如何列出目录内容,您将能够批量处理文件、监控更改,并构建强大的工具来进行数据组织和检索。

什么是目录?

目录是计算机文件系统的核心组件。它充当存储和组织文件以及其他目录(称为子目录)的容器。目录以分层结构组织,形成一个树状系统,其中每个目录可以有多个子目录,但只有一个父目录(根目录除外)。这种结构使用户和程序能够高效地组织、定位和管理文件,从而支持复杂的工作流程和大规模数据存储。了解目录的工作原理是任何使用文件系统的开发人员的基础。

使用 Files.list 非递归地列出目录内容

Files.list 方法提供了一种便捷的方式来获取指定目录中条目(文件和目录)的流。此方法是非递归的,这意味着它仅列出目录本身的内容,而不深入任何子目录。使用流可以有效处理大型目录,因为条目是延迟读取的,并且可以并行过滤、限制或处理。当您只想快速检查或处理文件夹的直接内容而不遍历其整个层次结构时,此方法特别有用。

Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

void main() throws IOException {

    String dirName = "..";

    try (Stream<Path> filesStream = Files.list(Paths.get(dirName))) {
        filesStream.limit(10).forEach(System.out::println);
    }
}

在此示例中,我们使用 Files.list 显示指定目录中的最多十个文件或目录。 limit(10) 操作将输出限制为前十个条目,这对于包含许多条目的目录很有用。每个条目都作为 Path 对象打印到控制台,使您可以查看顶层的文件和子目录。此方法非常适合快速预览或仅需要处理目录内容的子集时。

使用 Files.walk 递归地列出目录内容

Files.walk 方法可以从给定的根路径开始递归遍历目录树。它返回一个 Path 对象流,表示通过遍历文件树找到的所有文件和目录。此方法对于需要在目录及其子目录中处理或分析每个文件的场景非常强大,例如搜索特定文件类型、聚合数据或执行批处理操作。可以过滤该流,使其仅包含文件、目录或其他所需条件。

Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

void main() throws IOException {

    String pathName = "..";

    try (Stream<Path> paths = Files.walk(Paths.get(pathName))) {
        paths.filter(Files::isRegularFile)
                .forEach(System.out::println);
    }
}

此示例演示了如何使用 Files.walk 递归地列出指定目录及其子目录中的所有常规文件。通过应用 filter(Files::isRegularFile) 操作,该流仅限于常规文件,不包括目录和其他非文件条目。每个文件路径都打印到控制台,从而提供目录树中所有文件的完整视图。此方法对于文件搜索、索引编制或对项目或数据集中的每个文件执行操作等任务特别有用。

使用 Files.walkFileTree 非递归地列出目录内容

Files.walkFileTree 方法遍历以给定起始文件为根的文件树。它使用 FileVisitor 模式,该模式指定了在遍历过程中的关键点的所需行为:访问文件时、访问目录之前、访问目录之后或发生故障时。

Main.java
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;

void main() throws IOException {

    String dirName = "..";
    File file = new File(dirName);

    Files.walkFileTree(file.toPath(), Collections.emptySet(), 1, new SimpleFileVisitor<>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            System.out.println(file);
            return FileVisitResult.CONTINUE;
        }
    });
}

该示例使用 Files.walkFileTree 非递归地遍历目录。

Files.walkFileTree 的参数为:起始文件、配置遍历的选项、要访问的最大目录级别数、为每个文件调用的文件访问器。在我们的例子中,我们有一个要遍历的目录级别。

使用 Files.walkFileTree 递归地列出目录内容

在下面的示例中,我们使用 Files.walkFileTree 遍历整个目录结构。

Main.java
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

void main() throws IOException {

    String dirName = "..";
    File file = new File(dirName);

    Files.walkFileTree(file.toPath(), new SimpleFileVisitor<>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            System.out.println(file);
            return FileVisitResult.CONTINUE;
        }
    });
}

该示例使用重载的 Files.walkFileTree 方法来递归遍历目录。

使用 File 非递归地列出目录内容

java.io.File 类是列出目录内容的较旧的 API。它不如前面提到的现代 API 强大。 FilelistFiles 返回给定目录中的文件对象数组。

Main.java
import java.io.File;

void main() {

    String dirName = "..";

    File fileName = new File(dirName);
    File[] fileList = fileName.listFiles();

    if (fileList != null) {
        for (File file : fileList) {
    
            System.out.println(file);
        }
    }
}

该示例将给定目录的内容打印到控制台。它不会进入子目录。

使用 File 递归地列出目录内容

这次我们使用 java.io.File 类来递归地列出目录。

Main.java
import java.io.File;
import java.util.ArrayList;
import java.util.List;

List<File> files = new ArrayList<>();

void main() {

    String dirName = "..";
    File file = new File(dirName);

    List<File> myfiles = doListing(file);
    myfiles.forEach(System.out::println);
}

List<File> doListing(File dirName) {

    File[] fileList = dirName.listFiles();

    if (fileList != null) {
        for (File file : fileList) {

            if (file.isFile()) {

                files.add(file);
            } else if (file.isDirectory()) {

                files.add(file);
                doListing(file);
            }
        }
    }

    return files;
}

doListing 方法遍历目录并检索其内容。使用 isDirectory 方法,它可以确定一个项目是目录还是文件。对于遇到的每个目录,都会递归调用该方法,以继续列出其子目录和文件。这确保了有效处理所有嵌套文件夹。

来源

Java 基础 I/O

在本文中,我们展示了在 Java 中列出目录内容的各种方法。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有Java教程