如何修改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
相关产品推荐
相关产品推荐

