简单记录一下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/biumall.com walkFileTree visitFile file : /storage/emulated/0/biumall.com/91escom.txt walkFileTree visitFile file : /storage/emulated/0/biumall.com/biumall.com.txt
上面访问目录和文件都是返回FileVisitResult.CONTINUE,所以会继续访问,直到访问结束
demo 2
调用
walkFileTree("/storage/emulated/0");
日志打印
walkFileTree preVisitDirectory path : /storage/emulated/0
访问目录就返回终止,不管文件访问返回啥,都不会继续访问。
其他的组合就懒得写了,有需要的自己去验证。
参考文章
《
© 版权声明
不错,虽然流水文。
我也偶尔写写,主要方便自己查阅。
不错的习惯。