站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题支持通配符的广度优先的文件查找

支持通配符的广度优先的文件查找

摘要: 支持通配符的广度优先的文件查找

</td> </tr> <tr> <td height="35" valign="top" class="ArticleTeitle"> <table width="733" border="0"> <tr> <td> </td> </tr> </table>

一般的文件查找操作采用递归算法,而递归算法实则采用“深度优先”策略。在实际情况下,系统中要找的文件往往在距离待查找文件夹最近的文件夹中,因此,基于“广度优先”算法的文件查找的效率明显优先于“递归”算法。这里实现了支持通配符的基于“广度优先”算法的文件查找操作。
算法简述:从某个给定的需查找的文件夹出发,搜索该文件夹的所有子文件夹及文件,若为文件,则进行匹配,匹配成功则加入结果集,若为子文件夹,则进队列。队列不空,重复上述操作,队列为空,程序结束,返回结果。
下面是代码:


import java.util.Vector;
import java.io.File;
import java.util.ArrayList;
import java.io.UnsupportedEncodingException;

public class BFSFileSearch{
/**
*@param fileName String 需要查找的文件,可含通配符如*.java
*@param base File String 欲查找的文件夹
*@param ArrayList fileList 结果集
*@param count int 控制结果数量,为0,表示返回所有的匹配的文件
*/
public void scanFiles(File base,String fileName,ArrayList fileList,int count){
Queue queue=new Queue();//实例化队列
queue.put(base);//入队
while(!queue.isEmpty()){
File f=(File)queue.get();//出队列
if(f.exists()&&f.isDirectory()){
String[] files=f.list();
for(int i=0;i File f2=new File(f,files[i]);
if(f2.isDirectory()){//文件夹则进队列
queue.put(f2);
}else{//文件则进行匹配
String filePath=f2.getAbsolutePath();
filePath=filePath.substring(filePath.lastIndexOf("\\")+1);//提取文件名
if(wildcardMatch(fileName,filePath)){//匹配成功
if(count!=0&&fileList.size()>=count){
return;
}
fileList.add(f2.getAbsoluteFile());//添加到结果集
}
}
}
}
}
}

public boolean wildcardMatch(String pattern,String string){
int stringLength=string.length();
int stringIndex=0;
for(int patternIndex=0;patternIndex char c=pattern.charAt(patternIndex);

if(c=='*'){
while(stringIndex if(wildcardMatch(pattern.substring(patternIndex+1),string.substring(stringIndex))){
return true;
}
++stringIndex;
}//end of while

}else if(c=='?'){
++stringIndex;
if(stringIndex>stringLength){
return false;
}

}else{
if(stringIndex>=stringLength||c!=string.charAt(stringIndex)){
return false;
}
++stringIndex;
}
}
return stringIndex==stringLength;
}


class Queue{//先进先出的队列
private Vector vector=new Vector();

public void put(Object object){//入队
vector.addElement(object);
}

public Object get(){//出队
Object object=peek();
if(object!=null){
vector.removeElementAt(0);
}
return object;
}

public Object peek(){//取队列首元素
if(isEmpty()){
return null;
}
return vector.elementAt(0);
}

public boolean isEmpty(){//队列是否为空
return vector.isEmpty();
}

public int size(){//队列的大小
return vector.size();
}

}


public static void main(String[] paramert){
File file=new File("c:\\java");//在此目录中找文件
ArrayList fileList=new ArrayList();//结果集
String fileName="*.java";//找扩展名为java的文件
int countNumber=5;//最多返回五个文件,为0全部返回
BFSFileSearch search=new BFSFileSearch();
search.scanFiles(file,fileName,fileList,countNumber);//查找
for(int i=0;i System.out.println(fileList.get(i));//显示查找结果。
}

if(fileList.size()==0){
System.out.println("No File Fount.");
}
}
}

程序运行结果:

C:\java>JAVA BFSFileSearch
c:\java\BFSFileSearch.java
c:\java\chen\ItemChooser.java
c:\java\util\Tags.java
c:\java\com\corejsf\CreditCardExpiration.java
c:\java\com\corejsf\SpinnerRenderer.java

C:\java>

</td> </tr> <tr>


↑返回目录
前一篇: jar程序的用法
后一篇: 判断闰年与日、月、年是否有效的函数