zoukankan      html  css  js  c++  java
  • 遍历目录

    递归打印目录,效果与windows自带的tree命令的递归打印是一模一样的,为了实现pretty format费了好多功夫,这是一张效果图,我们先来观察一下:



    分析到规律了么,大概是这个样子的,为了方便观察空格使用点代替,只要能get到我想表达的意思就好  :)


    将前面的这些乱七八糟的东西称为偏移字串(我自己瞎编的,只是为了方便叙述),然后观察可以发现可以抽象为四类:

    1.  红色的,我称为非结束子项,意思就是这个不是父亲的最后一个孩子,就是用这个。

    2.  蓝色的,我称之为结束子项,意思就是这个是父项的最后一个孩子的话就使用这个,表示父项的孩子已经完结了。

    3.  绿色的,使用场景是父项并不是爷爷项的最后一个元素,这说明后面还要有,所以就是用表明没有结束,下面还有。

    4.  紫色的,这个是表示父项已经是爷爷项的最后一个元素,爷爷项的元素到这里就结束了。


    实现代码如下:

    import java.io.File;
    
    public class Main {
    
        public static void main(String[] args) {
            
            String path="D:/test_001/repo_002";
            
            show(new File(path),0,"");
            
        }
        
        private static String END="└───";
        private static String CHILD="├───";
        private static String SPACE="    "; 
        private static String LINK="│   ";
        
        //递归遍历目录
        public static void show(File file,int depth,String shift){
            System.out.print(shift);
            System.out.println(file.getName());
            
            if(file.isDirectory()){
                
                /*对子目录的共同前缀进行处理,避免在循环里重复处理。
                 * 计算依据就是如果shift是以“└───” 结尾的话就说明父项的父项已经结束了,就不要再使用“│   ”了,直接使用空格就可以了
                 * 否则的话还是使用“├───”
                 */
                String prefix="";
                if(shift.endsWith(END)){
                    prefix=shift.substring(0,shift.length()-4)+SPACE;
                }else if(shift.length()>=4){
                    prefix=shift.length()==4?LINK:shift.substring(0,shift.length()-4)+LINK;
                }
                
                File files[]=file.listFiles();
                for(int i=0;i<files.length;i++){
                    /*计算每个孩子独有的前缀部分
                     * 计算依据是如果当前元素是最后一项的话就使用“└───”表明父项已经结束了,
                     * 否则的话就是用"├───",这个表明后面还有元素呢
                     */
                    String t="";
                    if(i==files.length-1){
                        t=prefix+END;
                    }else{
                        t=prefix+CHILD;
                    }
                    
                    //递归调用
                    show(files[i],depth+1,t);
                }
            }
        }
    }




    .

  • 相关阅读:
    C# 查找其他应用程序并打开、显示、隐藏、关闭的API
    微信公众平台开发2-access_token获取及应用(含源码)
    Winform下编译Dev控件时提示license.licx文件错误
    JS+MySQL获取 京东 省市区 地区
    MySQL性能调优与架构设计——第11章 常用存储引擎优化
    MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
    MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化
    MySQL性能调优与架构设计——第1章 MySQL 基本介绍
    .NET基础 (21)ASP NET应用开发
    .NET基础 (20).NET中的数据库开发
  • 原文地址:https://www.cnblogs.com/cc11001100/p/5788869.html
Copyright © 2011-2022 走看看