最近面试的时候被问及,使用非递归的方式遍历文件夹下的所有文件。由于之前没有写过,当时卡了一下,最后也没给出好的方案。

从计算机的角度看,文件夹的数据结构就是多叉树(Tree),而树的遍历方式有两种:深度优先遍历和广度优先遍历。

1. 采用递归的方式实现深度优先遍历

这种方法最简单,不需要多解释。

private static void traverFile1(File file) {

System.out.println(file);

File[] files = file.listFiles();

if (files != null && files.isDirectory()) {

for (File f : files) {

traverFile1(f);

}

}

}

2. 借助队列结构来实现广度优先遍历

队列(Queue)的特点是先进先出,我们从头部取出 File 打印并移除,然后把 File 下的子 File 添加到队列,这样在遍历的时候,File 的层级是相同的,最终实现广度优先遍历。

private static void traverFile2(File file) {

LinkedList list = new LinkedList<>();

list.add(file);

while (!list.isEmpty()) {

File f = list.poll();

System.out.println(f);

File[] files = f.listFiles();

if (files != null) {

list.addAll(Arrays.asList(files));

}

}

}

3. 借助栈结构来实现深度优先遍历

栈(Stack)的特点是后进先出,把 File 出栈并打印,然后把 子 File 压栈,下次出栈的时候就是子 File,沿着一个方向层层向下,这样就实现了深度优先遍历。

private static void traverFile3(File file) {

LinkedList list = new LinkedList<>();

list.push(file);

while (!list.isEmpty()) {

File f = list.pop();

System.out.println(f);

File[] files = f.listFiles();

if (files != null) {

for (File fil : files) {

list.push(fil);

}

}

}

}

参考文章:

java遍历文件_Java 遍历文件夹的几种方式相关推荐

  1. java实现权限_Java实现权限管理的两种方式

    编辑特别推荐: 种方式:利用filter.xml文件和用户信息表配合使用来实现权限管理. 1.过滤器filter package cn.com.aaa.bbb.filter; import java. ...

  2. Java的基础方法Java的对象_java基础之 创建对象的几种方式

    有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...

  3. java多线程区别_Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  4. java细粒度锁_Java细粒度锁实现的3种方式

    最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响.初步的想法是通过数据的时间戳,id等关键字来加锁,从而保证不同类型数据处理的并发性.而java自 ...

  5. java 判断类型_Java变量类型识别的3种方式

    变量类型识别有3种方法: 通过反射拿到变量的类型 instanceof关键字判断 通过java的多态(方法重载)来DIY类型识别 具体看例子吧,尤其第三种方式 有一个自定义的TypeTools,我觉得 ...

  6. java 时间戳 对比_Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System ...

  7. java 调用接口_java调用http接口的几种方式总结

    本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnblogs.com/jeffen/p/69 ...

  8. java 常量定义_Java中常量定义的几种方式

    编程中使用常量的优点: 常量提取出来有利于代码阅读,而且下次再做这种判断不用手写或复制并且提高代码的复用率,方便修改,直接通过常量类就能得到.不过我觉得提取出来并不会有利于代码性能提升,因为常量分配在 ...

  9. java task多线程_JAVA语言-多线程实现的四种方式

    Java多线程实现的方式有四种 · 1.继承Thread类,重写run方法 · 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的tar ...

  10. java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

最新文章

  1. extjs4.0的高级组件grid补充01选择模式selection和表格特性feature
  2. 今日头条的面试题(部分)
  3. 谷歌开发专家带你学AI
  4. 静态网页制作html语言入门
  5. python输入水果求个数问题_水果爱好者:用Python解决一个简单的分类问题
  6. 四年,如何从前端小白蜕变为前端技术专家?
  7. 【已解决】Error: could not open `C:\Program Files\Java\jre1.8.0_121\lib\amd64\jvm.cfg‘
  8. Linux QoS ingress处理流程
  9. 腾讯视频手机app下载安装_腾讯视频怎么签到
  10. 使用openssl生成PEM格式私钥和公钥及ECDSA签名
  11. css之多行文本输出
  12. php提示修改成功,提示修改成功后怎么换回原来的页面
  13. qchart 坐标轴设置_「Qt」利用QChart实现实时动态的曲线数据展示
  14. 自定义类加载器的父类为什么是AppClassLoader?
  15. JavaWeb图书管理系统.rar(毕业设计(论文)+毕业设计指导书+大学毕业设计任务书+图书管理系统+毕业论文答辩)
  16. csapp-深入理解计算机系统学习记录
  17. Docker部署AI算法教程
  18. Linux系统开发|QT制作聊天软件实验报告
  19. 并行化:你的高并发大杀器
  20. oracle 排除节假日,ORACLE 计算节假日

热门文章

  1. mysql怎么判断是否断号_孩子是否有多动症,应该怎么判断呢?
  2. /MD /MDd /MT /MTd
  3. 【算法讲4:乘性函数(上)】欧拉函数 | 因子和函数 | 因子个数函数
  4. springboot Vue网吧会员信息管理系统java源码介绍
  5. 如何阅读一本书_03
  6. 《如何阅读一本书》目录
  7. macOS 系统向日葵远程控制鼠标无法点击的问题
  8. 一级计算机考试电子邮件发送模拟题目,9月计算机一级MSOffice考前模拟试题及答案...
  9. 思科AP常见型号和WiFi标准POE标准对应表
  10. Problem E: 时间:24小时制转12小时制