案例介绍:给定一个目录,要求按层级显示目录结构信息,文件名后面加上*或者是\来表示文件夹
案例设计:
- 使用递归算法
- 使用File类当中的ListFile来遍历文件夹
- 使用List集合
package javademo;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class IteratorDirDemo {
public static void main(String[] args) {
IteratorUnit.IteratorDir(new File("e:\\doc"));
}
}
class IteratorUnit{
private static int level=0;//层级数
public static void IteratorDir(File file){
if (file!=null) {
//找出递归的出口
//如果是文件夹或者空文件夹就返回
if (file.isFile()||file.listFiles().length==0) {
return;
}else {
File[] files=file.listFiles();
//要求是先输出文件夹,在输出文件
files =sort(files);
for (File f : files) {
//这是一个动态的字符串
StringBuilder sb = new StringBuilder();
if(f.isFile()){
sb.append(getTab(level));
sb.append(f.getName());
}else{
sb.append(getTab(level));
sb.append(f.getName());
sb.append("\\");
}
System.out.println(sb.toString());
//假设是文件夹
if (f.isDirectory()) {
level++; //进入目录遍历,层级加1
IteratorDir(f); //递归调用遍历目录的方法
level--; //当前文件夹遍历完成,退回到上一级,继续遍历下一个文件夹
}
}
}
}
}
/**
* 对File类型的数组进行先目录后数组的排序
*/
private static File[] sort(File[] files){
List<File> fList = new ArrayList<>();
//先存放文件夹(目录)
for (File f : files) {
if (f.isDirectory()) {
fList.add(f);
}
}
//在存放文件
for (File f : files) {
if (f.isFile()) {
fList.add(f);
}
}
//把集合当中的元素转换成为指定大小和指定类型的数组
return fList.toArray(new File[fList.size()]);
}
//根据层级数来返回\t的个数(所组成的字符串)
private static String getTab(int level){
StringBuilder sb = new StringBuilder();
for (int i = 0; i <level; i++) {
sb.append("\t");
}
return sb.toString();
}
}
效果如图所示