您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: