JAVA遍历目录
2015-05-30 10:22
441 查看
/*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
相关文章推荐
- java -- 轻量级锁
- java实现区域内屏幕截图示例
- Struts2注释
- Thinking In Java笔记(第七章 复用类)
- eclipse中的Java项目引入jar包直接在根目录下
- Eclipse Java注释模板设置详解
- Java Convert ArrayList<String> to String []
- eclipse 快捷键总结
- java 格式化时间
- java jdbc工具类
- Java之碰撞检测
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- 【Java基础】Spring之IOC特性
- myeclipse自带包和自己部署的包冲突解决问题方案
- Eclipse和MyEclipse 手动设置 Java代码 注释模板
- Java IO流:
- windows下Java环境变量的配置置
- Java垃圾回收机制
- java-策略模式
- Eclipse快捷键指南