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

 

在之前的Java版本中,若是要遍歷某個文件夾下全部的子文件、子文件夾,須要咱們本身寫遞歸,很麻煩。ide

 

在Java7之後,咱們能夠NIO.2中的Files工具類來遍歷某個文件夾(會自動遞歸)。工具

 

大體用法:post

 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);     spa

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

 

FileVisitor是一個接口,須要實現4個方法。固然咱們可使用適配器 SimpleFileVisitor 類,只重寫咱們須要的方法。code

4個方法的返回值類型均是FileVisitResult,FileVisitReset是一個枚舉類。表明訪問此文件/文件夾後的後續行爲。可以使用的值:對象

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

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

 

 

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

 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

相關文章
相關標籤/搜索