探秘JDK7新特性之遍歷文件樹
有時(shí)需要遞歸遍歷一個(gè)文件樹,比如查找一個(gè)文件夾內(nèi)符合條件的文件,查找某一天創(chuàng)建的文件……。jdk7 nio包提供一個(gè)新的接口 FileVisitor。它提供了遍歷文件樹的各種操作。
preVisitDirectory - 一個(gè)路徑被訪問時(shí)調(diào)用
PostVisitDirectory - 一個(gè)路徑的所有節(jié)點(diǎn)被訪問后調(diào)用。如果有錯(cuò)誤發(fā)生,exception會(huì)傳遞給這個(gè)方法
visitFile - 文件被訪問時(shí)被調(diào)用。該文件的文件屬性被傳遞給這個(gè)方法
visitFileFailed - 當(dāng)文件不能被訪問時(shí),此方法被調(diào)用。Exception被傳遞給這個(gè)方法。
如果你比較懶,不想實(shí)現(xiàn)所有方法。你可以選擇繼承 SimpleFileVisitor。它幫你實(shí)現(xiàn)了上述方法,你只需Override 你感興趣的方法。
下面給個(gè)例子,簡(jiǎn)單地遍歷一個(gè)文件夾,打印出所有信息
Java代碼
- import java.io.IOException;
- import java.nio.file.FileVisitResult;
- import java.nio.file.Files;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.nio.file.SimpleFileVisitor;
- import java.nio.file.attribute.BasicFileAttributes;
- /**
- * @author kencs@foxmail.com
- */
- public class FileVisitorTest extends SimpleFileVisitor
{ - private void find(Path path){
- System.out.printf("訪問-%s:%s%n",(Files.isDirectory(path)?"目錄":"文件"),path.getFileName());
- }
- @Override
- public FileVisitResult visitFile(Path file,BasicFileAttributes attrs){
- find(file);
- return FileVisitResult.CONTINUE;
- }
- @Override
- public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs){
- find(dir);
- return FileVisitResult.CONTINUE;
- }
- @Override
- public FileVisitResult visitFileFailed(Path file,IOException e){
- System.out.println(e);
- return FileVisitResult.CONTINUE;
- }
- public static void main(String[] args) throws IOException{
- if(args.length!=1){
- System.out.println("請(qǐng)輸入一個(gè)文件路徑作為參數(shù)");
- System.exit(-1);
- }
- Files.walkFileTree(Paths.get( args[0]), new FileVisitorTest());
- }
- }
隨便選擇一個(gè)路徑作為參數(shù)
java FileVisitorTest "C:\\Program Files\\Java\\jre7\\bin"
運(yùn)行結(jié)果代碼
- 訪問-目錄:bin
- 訪問-文件:awt.dll
- 訪問-文件:axbridge.dll
- 訪問-目錄:client
- 訪問-文件:classes.jsa
- 訪問-文件:jvm.dll
- 訪問-文件:Xusage.txt
- 訪問-文件:dcpr.dll
- 訪問-文件:deploy.dll
- 訪問-文件:deployJava1.dll
- 訪問-文件:dt_shmem.dll
- 訪問-文件:dt_socket.dll
- ......
注意 FileVisitResult有四種
CONTINUE –繼續(xù)
TERMINATE –終止,這次遍歷結(jié)束了
SKIP_SUBTREE –子樹(當(dāng)前路徑的子目錄)不再遍歷了
SKIP_SIBLINGS –兄弟節(jié)點(diǎn)(同級(jí)別目錄)不再訪問了。
可以通過這些返回值來控制遍歷文件樹的流程
【編輯推薦】