看到介绍java file类的文章,有一个遍历文件夹的练习,遍历某个目录下所有文件,包括子目录。写了一个用栈实现的递归遍历。
import java.io.File;
import java.util.Stack;
public class TraversalFile {
public static void main(String[] args) {
File dir = new File("D:/Study/code/Java/TraversalFile");
traversal(dir,1);
}
public TraversalFile() {
// TODO Auto-generated constructor stub
}
public static void traversal(File file,int depth) {
printName(file, depth);
File[] fileArray = file.listFiles();
Stackstack = new Stack();
for(File f:fileArray) {
if(f.isFile()) {
printName(f, depth + 1);
}
else {
stack.add(f);
}
}
while(stack.isEmpty() == false) {
traversal(stack.pop(),depth + 1);
}
}
public static void printName(File f, int signNum) {
StringBuilder builder = new StringBuilder();
//signNum个sign
for(int i=0;i
效果如下
递归调用的函数traversal
public static void traversal(File file,int depth) {
printName(file, depth);
File[] fileArray = file.listFiles();
Stackstack = new Stack();
for(File f:fileArray) {
if(f.isFile()) {
printName(f, depth + 1);
}
else {
stack.add(f);
}
}
while(stack.isEmpty() == false) {
traversal(stack.pop(),depth + 1);
}
}
函数首先调用了一个printName函数,用来打印当前传入文件的名字,包括前面的线条,然后遍历当前文件的子文件,如果是文件类型就打印出来,但是深度+1,深度是用来通过打印字符显示出文件层次的,如果是目录就入栈。遍历结束后就出栈并递归调用 traversal,直到所有文件打印完毕。
不使用stack也可以实现遍历,但是fileArray里面可能文件和目录是混着的,显示出来会比较乱,如果先打印文件,目录都入栈,之后处理,就可以区别开。
如果不考虑文件和目录是混着输出,下面这种写法更简洁。
如果是文件就返回,是目录就递归调用。
public static void traversal(File file,int depth) {
printName(file, depth);
if (file.isFile())
return;
File[] fileArray = file.listFiles();
for(File f:fileArray) {
traversal(f, depth + 1);
}
}
结果如下
printName函数
public static void printName(File f, int signNum) {
StringBuilder builder = new StringBuilder();
//signNum个sign
for(int i=0;i
文件或目录名前根据层级填充空格,最后用 |--紧接名字。