news 2026/4/30 15:06:28

378. Java IO API - 遍历文件树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
378. Java IO API - 遍历文件树

文章目录

  • 378. Java IO API - 遍历文件树
      • 🔧 `FileVisitor `接口简介
      • 🧰 更简单的选择:`SimpleFileVisitor`
      • 📦 示例:打印文件树中的所有文件及其大小
      • 🧪 使用场景示例
      • 🎯 补充建议

378. Java IO API - 遍历文件树

你是否需要构建一个应用,用来递归地遍历整个目录树?比如:

  • 🧹 删除所有.class文件?
  • 🕵️‍♀️ 查找最近一年未访问的文件?
  • 📁 统计某个目录下所有文件的大小?

Java NIO提供了一个非常强大的机制 ——FileVisitor接口,配合Files.walkFileTree()方法,可以高效优雅地完成这些操作。


🔧FileVisitor接口简介

FileVisitor<T>接口定义了在遍历文件树时的行为回调点

方法调用时机用途示例
preVisitDirectory(Path dir, BasicFileAttributes attrs)正在准备访问目录前打印或跳过目录
visitFile(Path file, BasicFileAttributes attrs)访问普通文件时删除、拷贝或分析文件
visitFileFailed(Path file, IOException exc)无法访问文件时记录错误,继续遍历
postVisitDirectory(Path dir, IOException exc)访问完目录后释放资源、清理操作

📌 注意:这个接口类似一个“钩子系统”,允许你在遍历每个文件或目录前后插入自己的逻辑。


🧰 更简单的选择:SimpleFileVisitor

如果你只对其中几个方法感兴趣,可以继承SimpleFileVisitor类,它已经实现了默认逻辑,你只需重写你关心的方法,省去样板代码。


📦 示例:打印文件树中的所有文件及其大小

importjava.io.IOException;importjava.nio.file.*;importjava.nio.file.attribute.*;importstaticjava.nio.file.FileVisitResult.*;publicclassFileTreeWalker{publicstaticclassPrintFilesextendsSimpleFileVisitor<Path>{// 每当访问一个文件时调用@OverridepublicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattr){if(attr.isSymbolicLink()){System.out.format("🔗 Symbolic link: %s",file);}elseif(attr.isRegularFile()){System.out.format("📄 Regular file: %s",file);}else{System.out.format("❓ Other: %s",file);}System.out.println(" ("+attr.size()+" bytes)");returnCONTINUE;}// 每当访问完一个目录后调用@OverridepublicFileVisitResultpostVisitDirectory(Pathdir,IOExceptionexc){System.out.format("📁 Directory: %s%n",dir);returnCONTINUE;}// 如果文件访问失败@OverridepublicFileVisitResultvisitFileFailed(Pathfile,IOExceptionexc){System.err.format("⚠️ Cannot access file: %s (%s)%n",file,exc);returnCONTINUE;// 忽略错误继续}}publicstaticvoidmain(String[]args)throwsIOException{PathstartingDir=Paths.get("your/start/path");// 修改为你自己的路径Files.walkFileTree(startingDir,newPrintFiles());}}

🧪 使用场景示例

  1. 删除.class文件

    if(file.toString().endsWith(".class")){Files.delete(file);}
  2. 查找一年未访问的文件

    FileTimelastAccessTime=(FileTime)Files.getAttribute(file,"lastAccessTime");if(lastAccessTime.toInstant().isBefore(Instant.now().minus(365,ChronoUnit.DAYS))){System.out.println("Old file: "+file);}
  3. 记录遍历日志并写入文件: 在visitFilepostVisitDirectory中写入日志内容到log.txt


🎯 补充建议

  • 遍历文件树是深度优先的。
  • 可以使用EnumSet.of(FileVisitOption.FOLLOW_LINKS)作为参数,开启对符号链接的支持。
  • 异常处理非常关键,不要中断整个遍历过程,除非你确实需要这么做。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 2:40:07

Spark DataFrame的填充技巧:从已知到未知

在处理数据时,我们经常会遇到需要在已知值之间进行填充的情况。今天我们将通过一个实例来探讨如何使用Spark DataFrame来实现这一目标。 实例背景 假设我们有一个Spark DataFrame,其中包含了用户的记录(Record),以及一些可能为null的目标值(Target)。我们希望根据已知…

作者头像 李华
网站建设 2026/4/11 2:37:06

SITS2026踩坑实录:47个生产环境AI推理延迟突增案例,含GPU调度错配、时序特征漂移检测及央行《智能风控接口规范》映射表

第一章&#xff1a;SITS2026案例&#xff1a;AI原生金融系统改造 2026奇点智能技术大会(https://ml-summit.org) 在2026年全球金融基础设施升级浪潮中&#xff0c;新加坡国际交易结算系统&#xff08;SITS&#xff09;启动代号为“Project Aether”的AI原生重构工程。该项目摒…

作者头像 李华
网站建设 2026/4/14 0:10:58

IC670PBI001总线接口单元

IC670PBI001 是 GE Fanuc Field Control 系列中的一款 Profibus 总线接口单元&#xff08;BIU&#xff09;&#xff0c;主要用于连接PLC与远程I/O模块&#xff0c;实现数据通信与系统控制&#xff0c;是分布式I/O系统中的核心组件。1、作为系统核心接口单元&#xff0c;实现PLC…

作者头像 李华
网站建设 2026/4/11 2:35:07

2026奇点大会闭门报告首发(仅限首批200名工程负责人):AI原生测试的7层抽象架构与4类不可逆迁移陷阱

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AI原生测试自动化 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上&#xff0c;“AI原生测试自动化”不再是一个愿景&#xff0c;而是已落地的工程范式——它将大语言模型、多模态推理与测试生命周…

作者头像 李华