当前位置: 首页 > news >正文

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)作为参数,开启对符号链接的支持。
  • 异常处理非常关键,不要中断整个遍历过程,除非你确实需要这么做。
http://www.jsqmd.com/news/621313/

相关文章:

  • Claude频发Bug,AI安全引担忧
  • VS2013创建首个C++程序教程
  • 2030年软件工程教育新图景:测试从业者的专业转型之路
  • 深入解析3A与ISP算法:从基础概念到实际应用
  • AI Agent 架构图解:大模型、记忆、RAG 与工具调用的协同机制畏
  • 10万开发者调查证实AI写的代码大部分是垃圾,这个Harness Engineering方法论把产出质量拉高了3倍
  • 告别一人一链!微信URL Scheme新规详解:如何让同一个链接被千万用户访问
  • Arduino嵌入式Modbus RTU通信实战指南
  • 雪女-斗罗大陆-造相Z-Turbo生成视频封面实战:结合AE模板批量产出
  • Qwen3.5-4B-Claude-Opus详细步骤:修改系统提示词打造专属AI助教方法
  • 单片机实战:按键切换LED流水灯模式与定时器中断的协同设计
  • Deneyap气压传感器模块与MS5637嵌入式驱动开发指南
  • AI理论能力或吞噬美国就业市场?真相并非如此
  • 深入解析SQL中的SYSDATE函数:从基础到高级应用
  • DeepSeek V4将至,基础设施能扛住吗?
  • Qwen2.5-VL图文对话模型应用:智能识图助手快速搭建与体验
  • 高效开发者的秘密武器:深度工作与心流状态
  • 从湖北师大真题看C语言核心考点:循环、递归、数组实战避坑指南
  • Krita AI绘画插件终极指南:如何一键实现智能选区与背景移除
  • 基于分时电价的改进粒子群算法在电动汽车充放电优化调度中的应用
  • BRIICK单总线按键模块:嵌入式低功耗矩阵键盘解决方案
  • M5-SX127x:面向ESP32的轻量级LoRa驱动库
  • PS2键盘鼠标接口电路设计实战指南
  • 当AI学会编程,我们还能做什么较
  • Stable Diffusion像素化创新:Pixel Fashion Atelier对复古RPG UI的现代化重构
  • VS2015环境下FreeImage库的安装与配置全攻略(含常见问题解决)
  • 一文讲清,精益成本管理是什么意思?精益成本的核心是什么?
  • 使用 Cloudlare 实现免费邮箱服务器搭建
  • OpenClaw 大结局——接入个人微信诤
  • 从基础设施到应用:小白程序员必备大模型学习与收藏指南