递归实例:按层级打印文件夹目录实例

package testProject;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class IoFileTest {
    public static void main(String[] args) {
        IteratorUtil.IteratorDir(new File("/home/zhaohy/Music"));
    }
    
    
}

class IteratorUtil{
    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) {
                    StringBuffer sb = new StringBuffer();
                    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++;//进入目录遍历,层级加一
                        IteratorDir(f);//递归调用遍历目录的方法
                        level--;//目录层级减一 返回上一级目录 继续打印输出
                    }
                    
                }
                
            }
        }
    }
    
    /**
     * 根据层级数返回制表符\t所组成的字符串
     * @param level
     * @return
     */
    private static String getTab(int level) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < level; i++) {
            sb.append("\t");
        }
        return sb.toString();
    }
    
    /**
     * 给file数组排序 先放文件夹再放文件
     * @param files
     * @return
     */
    private static File[] sort(File[] files) {
        List 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()]);
    }
}

你可能感兴趣的:(递归实例:按层级打印文件夹目录实例)