JAVA遍历目录

/*java实现了遍历文件和目录,文件过滤器,广度优先和深度优先两个版本*/

package jav;
 
import java.io.File;
import java.io.FilenameFilter;
import java.nio.channels.NonWritableChannelException;
import java.util.*;
import java.util.regex.Pattern;


/*过滤器,根据给定的模式对目录或文件进行匹配*/
class Filter implements FilenameFilter{
	private Pattern pattern;
	public Filter(String regex) {
		this.pattern = Pattern.compile(regex);
	}
	
	@Override
	public boolean accept(File dir, String name) {
		return pattern.matcher(name).matches();
	}
	
}

/*深度优遍历*/
class DfsVisitor{
	private int deep;
	private File path;
	private FilenameFilter filter;
	public DfsVisitor(String path,FilenameFilter filter) {
		this.path = new File(path);
		this.filter = filter;
		deep = 0;
		
	}
	
	public void go() {
		visit(path,deep);
	}
	/*深度优先算法,递归遍历*/
	private void visit(File dir,int deep){
		++deep;
		if (deep > 100)//最大深度,随便给的
			throw new RuntimeException("too deep to visit");
		
		File[] fl = dir.listFiles(filter);
		for(File file : fl){
			if (file.isDirectory()){
				
				/*打印其深度和目录名*/
				System.out.format("deep = %d , DIR = %s\n", deep,file);
				int d = deep;
				visit(file,d);
			}
			else {
				/*打印其深度和文件名*/
				System.out.format("deep = %d , FILE = %s\n", deep,file);
			}
		}
		
	}
}

/*广度优先遍历*/
class BfsVisitor{
	
	/*内部类,为File增加深度*/
	private class InnerFile extends File{
		public int deep;
		public InnerFile(String path,int deep) {
			super(path);
			this.deep = deep;			
		}
	}
	
	private LinkedList<InnerFile> filelist;
	private FilenameFilter filter;
	
	public BfsVisitor(String path,FilenameFilter filter) {
		filelist = new LinkedList<InnerFile>();
		InnerFile file = new InnerFile(path, 0);
		filelist.addLast(file);
		this.filter = filter;
		
	}
	public void go() {
		visit();		
	}
	

	/*广度优先算法*/
	void visit(){
		while (!filelist.isEmpty()){
			InnerFile dir = filelist.pollFirst();
			
			File[] list = dir.listFiles(filter);
			for(File item : list){
				InnerFile file = new InnerFile(item.getAbsolutePath(), dir.deep + 1);
				if (file.isDirectory()){
					filelist.addLast(file);
					/*打印其深度和目录名*/
					System.out.println("Deep = " + file.deep + " DIR = " + file);
				}
				else{
					/*打印其深度和文件名*/
					System.out.println("Deep = " + file.deep + " FILE = " + file);
				}
			}
				
		}
		
	}
}


public class main {
	public static void main(String[] args) {		
		try{
			Filter filter = new Filter(".*");//过滤器,随便给一个匹配模式
			
			DfsVisitor dfs = new DfsVisitor("C:\\Intel", filter);//深度优先,测试目录
			dfs.go();
			
			System.out.println("=====================");//分界线
			
			BfsVisitor bfs = new BfsVisitor("C:\\Intel", filter); //广度优先.测试目录
			bfs.go();
		}
		catch (Exception e){
			System.err.println(e);
		}
		
	}

}



输出结果:第一个是深度优先的结果,第二个是广度优先的结果

deep = 1 , DIR = C:\Intel\ExtremeGraphics
deep = 2 , DIR = C:\Intel\ExtremeGraphics\CUI
deep = 3 , DIR = C:\Intel\ExtremeGraphics\CUI\Resource
deep = 1 , DIR = C:\Intel\Logs
deep = 2 , FILE = C:\Intel\Logs\IntelAMT.log
deep = 2 , FILE = C:\Intel\Logs\IntelCPHS.log
deep = 2 , FILE = C:\Intel\Logs\IntelGFX.log
deep = 2 , FILE = C:\Intel\Logs\IntelGFXCoin.log
=====================
Deep = 1 DIR = C:\Intel\ExtremeGraphics
Deep = 1 DIR = C:\Intel\Logs
Deep = 2 DIR = C:\Intel\ExtremeGraphics\CUI
Deep = 2 FILE = C:\Intel\Logs\IntelAMT.log
Deep = 2 FILE = C:\Intel\Logs\IntelCPHS.log
Deep = 2 FILE = C:\Intel\Logs\IntelGFX.log
Deep = 2 FILE = C:\Intel\Logs\IntelGFXCoin.log
Deep = 3 DIR = C:\Intel\ExtremeGraphics\CUI\Resource


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值