注释比较多,这里就不再详细的讲解了
package IO;
import java.io.File;
import java.util.ArrayList;
public class DirectionShow {
public static void main(String[] args) {
File file = new File("G:/a");
deepShow(file);
}
private static int depth; // 每个文件或者目录的深度,以便于执行缩进操作
// 递归实现遍历所有的目录及文件,深度优先搜索
public static void deepShow(File file) {
// 首先要为递归实现一个出口, 是一个文件或者一个为空的目录,就不再递归
if (file.isFile() || file.list().length == 0) {
return;
}
else{
// 如果是一个不为空的文件目录,
// 首先将目录放在文件的前面,单独写一个函数排序
File[] sortedFile = sortDriection(file);
// 继续向下搜索,遍历所有的目录或者文件
for (File f : sortedFile) {
// 是文件或者空的一个目录就打印
printDirection(f);
// 是非空目录就继续向下搜寻
if (f.isDirectory())
{
depth++;
deepShow(f);
depth--;
}
}
}
}
// 将目录放在文件前面的排序函数
private static File[] sortDriection(File f) {
File[] fileArray = f.listFiles(); // 获取f下所有的目录或者文件
ArrayList<File> returnFile = new ArrayList<File>(); // 要返回的排序好的的文件数组
// 首先将目录放在前面
for (File ff : fileArray) {
if (ff.isDirectory()) {
returnFile.add(ff);
}
}
// 再把文件放在后面
for (File ff : fileArray) {
if (ff.isFile()) {
returnFile.add(ff);
}
}
return returnFile.toArray(fileArray);
// return returnFile.toArray( new File[returnFile.size()]); 这种写法可以
// return (File[]) returnFile.toArray(); 这种写法错误,不能将一个Object[] 转化为一个File[]
}
// 缩进并打印目录或者文件
private static void printDirection(File f) {
StringBuilder print = new StringBuilder();
// 根据深度进行缩进
for (int i = 0; i < depth; i++) {
print.append("\t");
}
// 缩进完,在该指定的位置上输出目录或者文件名
print.append(f.getName());
System.out.println(print);
}
}