使用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);}});}
使用该方法可以方式可以轻松删除该目录及目录下的所有内容(需要注意的是该删除方式是通过系统接口删除的无法恢复,所以在使用时需要慎重),不用自己在去写递归了。