Java NIO.2 使用Files類遍歷文件夾


 

在以前的Java版本中,如果要遍歷某個文件夾下所有的子文件、子文件夾,需要我們自己寫遞歸,很麻煩。

 

在Java7以后,我們可以NIO.2中的Files工具類來遍歷某個文件夾(會自動遞歸)。

 

大致用法:

 1     Path path=Paths.get("D:\\二次元");
 2         
 3         Files.walkFileTree(path,new FileVisitor<Path>(){
 4 
 5             //訪問文件夾之前自動調用此方法
 6             @Override
 7             public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
 8                 return null;
 9             }
10 
11             //訪問文件時自動調用此方法
12             @Override
13             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
14                 return null;
15             }
16 
17             //訪問文件失敗時自動調用此方法
18             @Override
19             public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
20                 return null;
21             }
22 
23             //訪問文件夾之后自動調用此方法
24             @Override
25             public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
26                 return null;
27             }
28         });



Files.walkFileTree(Path  path, FileVisitor visitor);     

靜態方法。第一個參數指定要遍歷的文件夾,第二個參數是FileVisitor對象,指定遍歷時如何處理文件、文件夾。

 

FileVisitor是一個接口,需要實現4個方法。當然我們可以使用適配器 SimpleFileVisitor 類,只重寫我們需要的方法。

4個方法的返回值類型均是FileVisitResult,FileVisitReset是一個枚舉類。代表訪問此文件/文件夾后的后續行為。可使用的值:

  • CONTINUE     繼續訪問(/遍歷)
  • TERMINATE    停止訪問(/遍歷)
  • SKIP_SUBTREE    繼續訪問,但不訪問此文件/文件夾的子目錄樹
  • SKIP_SIBLINGS     繼續訪問,但不訪問此文件/文件夾的兄弟文件/文件夾。

需要以  FileVisitResult.  的形式引用,示例:FileVisitResult.CONTINUE    

 

 

示例:輸出每個文件、文件夾的名稱。

 1     Path path=Paths.get("D:\\二次元");
 2 
 3         Files.walkFileTree(path,new FileVisitor<Path>(){
 4 
 5             //訪問文件夾之前自動調用此方法
 6             @Override
 7             public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
 8                 System.out.println(dir.getFileName());
 9                 return FileVisitResult.CONTINUE;
10             }
11 
12             //訪問文件時自動調用此方法
13             @Override
14             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
15                 System.out.println(file.getFileName());
16                 return FileVisitResult.CONTINUE;
17             }
18 
19             //訪問文件失敗時自動調用此方法
20             @Override
21             public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
22                 return FileVisitResult.CONTINUE;
23             }
24 
25             //訪問文件夾之后自動調用此方法
26             @Override
27             public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
28                 return FileVisitResult.CONTINUE;
29             }
30         });

 

 

作為根的文件夾(上例中的“二次元”)也算作一個遍歷的節點。

 

PreVisitDirectory()、PostVisitDirectory()、VisitFile()這3個方法,不能返回null,如果返回null,編譯時ok,但運行時往往會報錯——空指針異常。IDEA下的代碼自動完成,4個方法的默認實現都是return null,需要注意。

 

 

 

 Java的工具類的命名一般是在對應類后面加一個s。比如:

Collection  Collections

Array    Arrays

File    Files

FileSystem   FileSystems

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM