-
简单记录一下Files.walkFileTree()的使用。
在Android sdk版本大于 Build.VERSION_CODES.O中可以使用。
正文
Files.walkFileTree()中方法有两个
# 第一个 public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor) throws IOException { return walkFileTree(start, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor); } # 第二个 public static Path walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor) throws IOException { //略 }
第一个也是调用第二个方法。
walkFileTree
这里就以第一个为例
public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor) throws IOException { return walkFileTree(start, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor); }
需要传入两个参数:
-
Path:文件起始路径
-
FileVisitor:文件访问器,使用访问者模式
FileVisitor
FileVisitor是一个文件访问器,调用walkFileTree()方法后,会自动遍历start路径下的所有文件和子目录,遍历文件和子目录都会触发FileVisitor中相应的方法。
FileVisitor方法
public interface FileVisitor<T> { //访问目录前的操作 FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException; //访问文件的操作 FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException; //访问文件失败时的操作 FileVisitResult visitFileFailed(T file, IOException exc) throws IOException; //访问目录后的操作 FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException; }
上面方法不一定都要重写,选择自己需要的即可。
FileVisitResult
返回FileVisitResult是⼀个枚举
-
CONTINUE 代表继续访问的后续⾏为
-
SKIP_SIBLINGS 代表继续访问的后续⾏为,但不访问该⽂件后⽬录的兄弟⽂件或⽬录
-
SKIP_SUBTREE 代表继续访问的后续⾏为,但不访问该⽂件或⽬录的⼦⽬录树
-
TERMINATE 代表终⽌访问的后续⾏为
小试牛刀
这里用了FileVisitor的实现类SimpleFileVisitor为例。
demo 1
调用
walkFileTree("/storage/emulated/0");
日志打印
walkFileTree preVisitDirectory path : /storage/emulated/0 walkFileTree preVisitDirectory path : /storage/emulated/0/91es walkFileTree preVisitDirectory path : /storage/emulated/0/91es-com walkFileTree visitFile file : /storage/emulated/0/91es-com/91escom.txt walkFileTree visitFile file : /storage/emulated/0/91es-com/91es-com.txt
上面访问目录和文件都是返回FileVisitResult.CONTINUE,所以会继续访问,直到访问结束
demo 2
调用
walkFileTree("/storage/emulated/0");
日志打印
walkFileTree preVisitDirectory path : /storage/emulated/0
访问目录就返回终止,不管文件访问返回啥,都不会继续访问。
其他的组合就懒得写了,有需要的自己去验证。
参考文章
-
《
-
历史上的今天
- 2023: 《RecyclerView对Item拖动和上下滑动记录(0条评论)》
- 2022: 《Android反编译之vdex转dex查看源码(2条评论)》
- 2021: 《中文汉字和英文数字的unicode编码范围(1条评论)》
- 2020: 《冰心:一日的春光(0条评论)》
不错,虽然流水文。
我也偶尔写写,主要方便自己查阅。
不错的习惯。