java實(shí)現(xiàn)文件搜索主要使用file類和正則表達(dá)式,如下示例:
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),岳陽(yáng)縣企業(yè)網(wǎng)站建設(shè),岳陽(yáng)縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,岳陽(yáng)縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,岳陽(yáng)縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
package?com.kiritor.util;
import?java.io.File;
import?java.io.FileFilter;
import?java.util.Arrays;
import?java.util.Collections;
import?java.util.List;
/**
*?文件的相關(guān)操作類
*?
*?@author?Kiritor
*/
public?class?FileOperation?{
private?static?String?contentPath;
private?static?String?filePath;
private?static?File[]?fileList?=?null;//?保存文件列表,過(guò)濾掉目錄
public?FileOperation()?{
}
/**?構(gòu)造函數(shù)的參數(shù)是一個(gè)目錄?*/
public?FileOperation(String?path)?{
File?file?=?new?File(path);
if?(file.isDirectory())
this.contentPath?=?path;
else
this.filePath?=?path;
}
/**獲取文件列表*/
public?static?File[]?getFiles()?{
if?(contentPath?==?null)?{
File?file?=?new?File(filePath);
fileList?=?new?File[1];
fileList[0]?=?file;
return?fileList;
}
fileList?=?new?File(contentPath).listFiles(new?FileFilter()?{
/**使用過(guò)濾器過(guò)濾掉目錄*/
@Override
public?boolean?accept(File?pathname)?{
if(pathname.isDirectory())
{
return?false;
}else
return?true;
}
});
return?fileList;
}
/**?對(duì)當(dāng)前目錄下的所有文件進(jìn)行排序?*/
public?static?File[]?sort()?{
getFiles();
Arrays.sort(fileList,?new?FileComparator());
return?fileList;
}
public?static?void?tree(File?f,?int?level)?{
String?preStr?=?"";
for(int?i=0;?ilevel;?i++)?{
preStr?+=?"????";
}
File[]?childs?=?f.listFiles();
//返回一個(gè)抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中的文件。
for(int?i=0;?ichilds.length;?i++)?{
System.out.println(preStr?+?childs[i].getName());
if(childs[i].isDirectory())?{
tree(childs[i],?level?+?1);
}
}
}
//?提供一個(gè)"比較器"
static?class?FileComparator?implements?java.util.ComparatorFile?{
@Override
public?int?compare(File?o1,?File?o2)?{
//?按照文件名的字典順序進(jìn)行比較
return?o1.getName().compareTo(o2.getName());
}
}
}
File[] roots = File.listRoots();
for (int i =0; i roots.length; i++) {
System.out.println(roots[i]);
}
放入main里執(zhí)行就知道,獲取所有盤符。
查找文件時(shí)需要讀取該盤符的所有文件夾、文件。同時(shí)如果是文件夾遞歸讀取里面的文件夾、文件,就是這個(gè)思路。
只是獲取某個(gè)路徑下的文件夾?
可以用File里面的listFiles() 方法獲取到該路徑下的所有File對(duì)象的數(shù)組引用
如果想用類似于windows中的打開(kāi)、保存那樣的對(duì)話框可以調(diào)用
JFileChooser類
你是搜文件名,還是搜文件內(nèi)容?要是搜文件內(nèi)容可就麻煩了,有可能的話你看看Java的一個(gè)開(kāi)源庫(kù)Lucene。
要是簡(jiǎn)單的搜文件名包含的字符串,大致應(yīng)該涉及到文件樹(shù)的遍歷算法,最多用一些簡(jiǎn)單的正則表達(dá)式來(lái)匹配文件名,一般用遞歸可以實(shí)現(xiàn)任意級(jí)目錄樹(shù)的搜索。
給你個(gè)簡(jiǎn)單的版本吧:
package?test.tool;
import?java.io.BufferedReader;
import?java.io.File;
import?java.io.FileReader;
import?java.io.IOException;
import?java.util.regex.Matcher;
import?java.util.regex.Pattern;
public?class?FindFile?{
private?String?fileName?=?"";
private?String?dir?=?"";
private?Matcher?m?=?null;
private?int?count?=?0;
public?FindFile()?throws?IOException?{
String?f?=?FindFile.class.getResource("findfile.properties").getFile();
BufferedReader?read?=?new?BufferedReader(new?FileReader(f));
dir?=?read.readLine().trim();
fileName?=?read.readLine().trim();
Pattern?p?=?Pattern.compile(fileName);
m?=?p.matcher("");
}
public?void?find()?{
File?root?=?new?File(dir);
for?(File?f?:?root.listFiles())?{
if?(f.isDirectory())?{
dir?=?f.getAbsolutePath();
find();
}?else?{
m.reset(f.getName());
if?(m.find())?{
count++;
System.out.println(f.getAbsolutePath());
}
}
}
}
public?static?void?main(String[]?args)?{
try?{
FindFile?ff?=?new?FindFile();
ff.find();
System.out.println("\n共找到文件數(shù)目:"?+?ff.count);
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
里面用到的findfile.properties,舉個(gè)例子:
F:\download
vod.*.exe
運(yùn)行效果如下:
F:\download\firefox\vodplayer.exe
F:\download\ie\vodplayer.exe
共找到文件數(shù)目:2
可以使用遞歸調(diào)用的方法逐個(gè)檢索你的文件,直到文件內(nèi)成空。