/*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