You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Java代码遍历主目录及子目录下的所有.csv文件?

实现递归遍历目录及子目录下的所有.csv文件

你的现有代码仅能遍历指定目录下的一级文件,要实现包含子目录的递归遍历,有两种常用方案:

方案一:传统递归遍历(基于java.io.File)

通过递归函数遍历每个目录,遇到子目录就继续深入,遇到符合条件的.csv文件就输出信息。同时注意修正原代码中获取文件大小的错误(原代码用getTotalSpace()返回的是磁盘总容量,而非文件实际大小,应替换为file.length())。

import java.io.File;
import java.io.FilenameFilter;

public class CsvFileLister {
    // 复用你的CSV过滤规则
    private static final FilenameFilter CSV_FILTER = (dir, name) -> 
        name.toLowerCase().endsWith(".csv");

    public static void main(String[] args) {
        File rootDirectory = new File("C:\\in_progress");
        System.out.println("所有目录及子目录下的.csv文件列表:");
        listCsvFilesRecursively(rootDirectory);
    }

    private static void listCsvFilesRecursively(File directory) {
        // 处理当前目录下的所有.csv文件
        File[] csvFiles = directory.listFiles(CSV_FILTER);
        if (csvFiles != null) {
            for (File file : csvFiles) {
                printFileDetails(file);
            }
        }

        // 获取所有子目录并递归遍历
        File[] subDirectories = directory.listFiles(File::isDirectory);
        if (subDirectories != null) {
            for (File subDir : subDirectories) {
                listCsvFilesRecursively(subDir);
            }
        }
    }

    private static void printFileDetails(File file) {
        System.out.println("文件名: " + file.getName());
        System.out.println("文件路径: " + file.getAbsolutePath());
        System.out.println("文件大小: " + file.length() + " 字节");
        System.out.println();
    }
}

方案二:Java 8+ NIO.2 流式遍历(更简洁高效)

使用Files.walk方法递归遍历所有路径,通过Stream API过滤出符合条件的.csv文件,代码更简洁且性能更优:

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

public class CsvFileListerNIO {
    public static void main(String[] args) {
        Path rootPath = Paths.get("C:\\in_progress");

        // try-with-resources自动关闭Stream,避免资源泄漏
        try (Stream<Path> fileStream = Files.walk(rootPath)) {
            System.out.println("所有目录及子目录下的.csv文件列表:");
            fileStream
                .filter(Files::isRegularFile) // 仅处理普通文件(排除目录)
                .filter(path -> path.getFileName().toString().toLowerCase().endsWith(".csv"))
                .forEach(CsvFileListerNIO::printFileDetails);
        } catch (IOException e) {
            System.err.println("遍历文件时出现错误:" + e.getMessage());
            e.printStackTrace();
        }
    }

    private static void printFileDetails(Path path) {
        try {
            System.out.println("文件名: " + path.getFileName());
            System.out.println("文件路径: " + path.toAbsolutePath());
            System.out.println("文件大小: " + Files.size(path) + " 字节");
            System.out.println();
        } catch (IOException e) {
            System.err.println("获取文件信息失败:" + path.getFileName());
            e.printStackTrace();
        }
    }
}

注意事项

  • 权限处理:如果遍历过程中遇到无访问权限的目录,会抛出IOException,可根据业务需求添加更细致的异常捕获逻辑
  • 空目录判断:listFiles()方法在目录不存在或无权限时会返回null,必须先判断再处理,避免NullPointerException
  • 文件大小修正:务必替换原代码中的getTotalSpace(),该方法返回的是文件所在磁盘的总容量,而非文件实际大小

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:55:41