使用Files.walkFileTree遍歷目錄文件_第1頁(yè)
使用Files.walkFileTree遍歷目錄文件_第2頁(yè)
使用Files.walkFileTree遍歷目錄文件_第3頁(yè)
使用Files.walkFileTree遍歷目錄文件_第4頁(yè)
使用Files.walkFileTree遍歷目錄文件_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第使用Files.walkFileTree遍歷目錄文件目錄1.Files.walkFileTree的原理介紹2.遍歷行為控制器FileVisitor3.遍歷行為結(jié)果FileVisitResult4.查找指定文件5.使用PathMatcher5.1全局規(guī)則glob5.2正則規(guī)則regex6.查找指定文件7.遍歷單層目錄8.復(fù)制文件到新目錄9.文件和流的復(fù)制10.Path與File的轉(zhuǎn)換java.nio.file.Files.walkFileTree是JDK7新增的靜態(tài)工具方法。

1.Files.walkFileTree的原理介紹

staticPathwalkFileTree(Pathstart,SetFileVisitOptionoptions,intmaxDepth,FileVisitorsuperPathvisitor)throwsIOException;

staticPathwalkFileTree(Pathstart,FileVisitorsuperPathvisitor)throwsIOException;

參數(shù)列表:

java.nio.file.Pathstart遍歷的起始路徑Setjava.nio.file.FileVisitOptionoptions遍歷選項(xiàng)intmaxDepth遍歷深度java.nio.file.FileVisitorsuperPathvisitor遍歷過(guò)程中的行為控制器

2.遍歷行為控制器FileVisitor

接口java.nio.file.FileVisitor包含四個(gè)方法,涉及到遍歷過(guò)程中的幾個(gè)重要的步驟節(jié)點(diǎn)。

一般實(shí)際中使用SimpleFileVisitor簡(jiǎn)化操作。

publicinterfaceFileVisitorT{

FileVisitResultpreVisitDirectory(Tdir,BasicFileAttributesattrs)

throwsIOException;

FileVisitResultvisitFile(Tfile,BasicFileAttributesattrs)

throwsIOException;

FileVisitResultvisitFileFailed(Tfile,IOExceptionexc)

throwsIOException;

FileVisitResultpostVisitDirectory(Tdir,IOExceptionexc)

throwsIOException;

}

preVisitDirectory訪問(wèn)一個(gè)目錄,在進(jìn)入之前調(diào)用。postVisitDirectory一個(gè)目錄的所有節(jié)點(diǎn)都被訪問(wèn)后調(diào)用。遍歷時(shí)跳過(guò)同級(jí)目錄或有錯(cuò)誤發(fā)生,Exception會(huì)傳遞給這個(gè)方法visitFile文件被訪問(wèn)時(shí)被調(diào)用。該文件的文件屬性被傳遞給這個(gè)方法visitFileFailed當(dāng)文件不能被訪問(wèn)時(shí),此方法被調(diào)用。Exception被傳遞給這個(gè)方法。

3.遍歷行為結(jié)果FileVisitResult

publicenumFileVisitResult{

CONTINUE,

TERMINATE,

SKIP_SUBTREE,

SKIP_SIBLINGS;

}

CONTINUE繼續(xù)遍歷SKIP_SIBLINGS繼續(xù)遍歷,但忽略當(dāng)前節(jié)點(diǎn)的所有兄弟節(jié)點(diǎn)直接返回上一層繼續(xù)遍歷SKIP_SUBTREE繼續(xù)遍歷,但是忽略子目錄,但是子文件還是會(huì)訪問(wèn)TERMINATE終止遍歷

4.查找指定文件

使用java.nio.file.Path提供的startsWith、endsWith等方法,需要特別注意的是:匹配的是路徑節(jié)點(diǎn)的完整內(nèi)容,而不是字符串。

例如:/usr/web/bbf.jar

Pathpath=Paths.get("/usr/web/bbf.jar");

path.endsWith("bbf.jar");

//true

path.endsWith(".jar");

//false

5.使用PathMatcher

@Test

publicvoidvisitFile2()throwsIOException{

//查找java和txt文件

Stringglob="glob:**/*.{java,txt}";

Stringpath="D:\\work_java\\bbf\\CORE";

finalPathMatcherpathMatcher=FileSystems.getDefault().getPathMatcher(glob);

Files.walkFileTree(Paths.get(path),newSimpleFileVisitorPath(){

@Override

publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs)

throwsIOException{

if(pathMatcher.matches(file)){

System.out.println(file);

returnFileVisitResult.CONTINUE;

}

getPathMatcher方法的參數(shù)語(yǔ)法:規(guī)則:模式,其中規(guī)則支持兩種模式glob和regex。

5.1全局規(guī)則glob

使用類似于正則表達(dá)式但語(yǔ)法更簡(jiǎn)單的模式,匹配路徑的字符串。

glob:*.java匹配以java結(jié)尾的文件glob:.匹配包含.的文件glob:*.{java,class}匹配以java或class結(jié)尾的文件glob:foo.匹配以foo開(kāi)頭且一個(gè)字符擴(kuò)展名的文件glob:/home//在unix平臺(tái)上匹配,例如/home/gus/data等glob:/home/**在unix平臺(tái)上匹配,例如/home/gus,/home/gus/dataglob:c:\\*在windows平臺(tái)上匹配,例如c:foo,c:bar,注意字符串轉(zhuǎn)義

5.1.1規(guī)則說(shuō)明

*匹配零個(gè)或多個(gè)字符與名稱組件,不跨越目錄**匹配零個(gè)或多個(gè)字符與名稱組件,跨越目錄(含子目錄)匹配一個(gè)字符的字符與名稱組件\轉(zhuǎn)義字符,例如{表示匹配左花括號(hào)[]匹配方括號(hào)表達(dá)式中的范圍,連字符(-)可指定范圍。例如[ABC]匹配A、B和C;[a-z]匹配從a到z;[abce-g]匹配a、b、c、e、f、g;[!..]匹配范圍之外的字符與名稱組件,例如[!a-c]匹配除a、b、c之外的任意字符{}匹配組中的任意子模式,多個(gè)子模式用,分隔,不能嵌套。

5.2正則規(guī)則regex

使用java.util.regex.Pattern支持的正則表達(dá)式。

5.2.1示例

獲取指定擴(kuò)展名的文件

以下測(cè)試用例,目的都是獲取指定目錄下的.properties和.html文件。

/**

*遞歸遍歷,字符串判斷

*@throwsIOExceptionIO異常

@Test

publicvoidvisitFile1()throwsIOException{

Stringpath="D:\\work_java\\hty\\HTY_CORE";

Files.walkFileTree(Paths.get(path),newSimpleFileVisitorPath(){

@Override

publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs)

throwsIOException{

StringpathStr=file.toString();

if(pathStr.endsWith("properties")||pathStr.endsWith("html")){

System.out.println(file);

returnFileVisitResult.CONTINUE;

*遞歸遍歷,glob模式

*@throwsIOExceptionIO異常

@Test

publicvoidvisitFile2()throwsIOException{

Stringglob="glob:**/*.{properties,html}";

Stringpath="D:\\work_java\\hty\\HTY_CORE";

finalPathMatcherpathMatcher=FileSystems.getDefault().getPathMatcher(glob);

Files.walkFileTree(Paths.get(path),newSimpleFileVisitorPath(){

@Override

publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs)

throwsIOException{

if(pathMatcher.matches(file)){

System.out.println(file);

returnFileVisitResult.CONTINUE;

*遞歸遍歷,正則模式

*@throwsIOExceptionIO異常

@Test

publicvoidvisitFile3()throwsIOException{

//(i)忽略大小寫(xiě),(:)標(biāo)記該匹配組不應(yīng)被捕獲

Stringreg="regex:.*\\.(i)(:properties|html)";

Stringpath="D:\\work_java\\hty\\HTY_CORE";

finalPathMatcherpathMatcher=FileSystems.getDefault().getPathMatcher(reg);

Files.walkFileTree(Paths.get(path),newSimpleFileVisitorPath(){

@Override

publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs)

throwsIOException{

if(pathMatcher.matches(file)){

System.out.println(file);

returnFileVisitResult.CONTINUE;

}

6.查找指定文件

/**

*查找指定文件

*@throwsIOExceptionIO異常

@Test

publicvoidvisitFile()throwsIOException{

Stringpath="D:\\work_java\\hty\\HTY_CORE\\src";

Files.walkFileTree(Paths.get(path),newSimpleFileVisitorPath(){

@Override

publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs)

throwsIOException{

//使用endsWith,必須是路徑中的一段,而不是幾個(gè)字符

if(file.endsWith("log.java")){

System.out.println(file);

//找到文件,終止操作

returnFileVisitResult.TERMINATE;

returnFileVisitResult.CONTINUE;

}

7.遍歷單層目錄

使用DirectoryStream會(huì)獲取指定目錄下的目錄和文件??梢允褂胣ewDirectoryStream的第二個(gè)參數(shù)進(jìn)行篩選,glob語(yǔ)法。

/**

*遍歷單層目錄

*@throwsIOExceptionIO異常

@Test

publicvoiddir()throwsIOException{

Pathsource=Paths.get("D:\\work_java\\hty\\HTY_CORE\\src\\main\\resources");

try(DirectoryStreamPathstream=Files.newDirectoryStream(source,"*.xml")){

IteratorPathite=stream.iterator();

while(ite.hasNext()){

Pathpp=ite.next();

System.out.println(pp.getFileName());

}

8.復(fù)制文件到新目錄

/**

*遞歸復(fù)制

*@throwsIOExceptionIO異常

@Test

publicvoidcopyAll()throwsIOException{

Pathsource=Paths.get("D:\\work_java\\hty\\HTY_CORE\\src");

Pathtarget=Paths.get("D:\\temp\\core");

//源文件夾非目錄

if(!Files.isDirectory(source)){

thrownewIllegalArgumentException("源文件夾錯(cuò)誤");

//源路徑的層級(jí)數(shù)

intsourcePart=source.getNameCount();

Files.walkFileTree(source,newSimpleFileVisitorPath(){

@Override

publicFileVisitResultpreVisitDirectory(Pathdir,BasicFileAttributesattrs)

throwsIOException{

//在目標(biāo)文件夾中創(chuàng)建dir對(duì)應(yīng)的子文件夾

PathsubDir;

if(pareTo(source)==0){

subDir=target;

}else{

//獲取相對(duì)原路徑的路徑名,然后組合到target上

subDir=target.resolve(dir.subpath(sourcePart,dir.getNameCount()));

Files.createDirectories(subDir);

returnFileVisitResult.CONTINUE;

@Override

publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs)throwsIOException{

Files.copy(file,target.resolve(file.subpath(sourcePart,file.getNameCount())),

StandardCopyOption.REPLACE_EXISTING);

returnFileVisitResult.CONTINUE;

System.out.println("復(fù)制完畢");

}

9.文件和流的復(fù)制

/**

*流復(fù)制到文件

*@throwsIOExceptionIO異常

@Test

publicvoidcopy1()throwsIOException{

Pathsource=Paths.get("D:\\work_java\\hty\\HTY_CORE\\src\\main\\resources\\ehcache.xml");

Pathtarget=Paths.get("D:\\temp\\");

if(!Files.exists(target)){

Files.createDirectories(target);

PathtargetFile=target.resolve(source.getFileName());

try(InputStreamfs=FileUtils.openInputStream(source.toFile())){

Files.copy(fs,targetFile,StandardCopyOption.REPLACE_EXISTING);

*文件復(fù)制到流

*@throwsIOExceptionIO異常

@Test

publicvoidcopy2()throwsIOException{

Pathsource=Paths.get("D:\\work_java\\hty\\HTY_CORE\\src\\main\\resources\\ehcache.xml");

Pathtarget=Paths.get("D:\\temp\\core");

PathtargetFile=target.resolve(source.getFileName());

if(!Files.exists(target)){

Files.createDirectories(target);

try(OutputStreamfs=FileUtils.openOutputStream(targetFile.toFile());

O

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論