遍历目录

递归打印目录,效果与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);
			}
		}
	}
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值