使用Files工具類中的walkFileTree(Path, FileVisitor)方法,其中需要傳入兩個參數
- Path:文件起始路徑
- FileVisitor:文件訪問器,使用訪問者模式
- 接口的實現類SimpleFileVisitor有四個方法
- preVisitDirectory:訪問目錄前的操作
- visitFile:訪問文件的操作
- visitFileFailed:訪問文件失敗時的操作
- postVisitDirectory:訪問目錄后的操作
- 接口的實現類SimpleFileVisitor有四個方法
FileVisitor類使用了設計模式中的訪問者模式,通過匿名內部類的方式創建FileVisitor的具體實現,只需重寫需要用到方法即可。
1.查看并統計文件夾下的所有目錄和文件
public class TestWalkFileTree {public static void main(String[] args) throws IOException {Path path = Paths.get("F:\\JDK 8");// 文件目錄數目AtomicInteger dirCount = new AtomicInteger();// 文件數目AtomicInteger fileCount = new AtomicInteger();Files.walkFileTree(path, new SimpleFileVisitor<Path>(){@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {System.out.println("===>"+dir);// 增加文件目錄數dirCount.incrementAndGet();return super.preVisitDirectory(dir, attrs);}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {System.out.println(file);// 增加文件數fileCount.incrementAndGet();return super.visitFile(file, attrs);}});// 打印數目System.out.println("文件目錄數:"+dirCount.get());System.out.println("文件數:"+fileCount.get());}
}
運行結果如下
...
===>F:\JDK 8\lib\security\policy\unlimited
F:\JDK 8\lib\security\policy\unlimited\local_policy.jar
F:\JDK 8\lib\security\policy\unlimited\US_export_policy.jar
F:\JDK 8\lib\security\trusted.libraries
F:\JDK 8\lib\sound.properties
F:\JDK 8\lib\tzdb.dat
F:\JDK 8\lib\tzmappings
F:\JDK 8\LICENSE
F:\JDK 8\README.txt
F:\JDK 8\release
F:\JDK 8\THIRDPARTYLICENSEREADME-JAVAFX.txt
F:\JDK 8\THIRDPARTYLICENSEREADME.txt
F:\JDK 8\Welcome.html
文件目錄數:23
文件數:279
2.刪除目錄下的所有文件和目錄
根據SimpleFileVisitor的四個方法可以發現
visitFile和postVisitDirectory兩個方法可以解決需求
public static void main(String[] args) throws IOException {Path path = Paths.get("D:\\test_deletedir");Files.walkFileTree(path,new SimpleFileVisitor<Path>(){@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {System.out.println("===> 進入"+dir);return super.preVisitDirectory(dir, attrs);}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {System.out.println(file);// 刪除文件Files.delete(file);return super.visitFile(file, attrs);}@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {System.out.println("===> 退出" + dir);Files.delete(dir);return super.postVisitDirectory(dir, exc);}});}
使用該方法可以方式可以輕松刪除該目錄及目錄下的所有內容(需要注意的是該刪除方式是通過系統接口刪除的無法恢復,所以在使用時需要慎重),不用自己在去寫遞歸了。