访问者模式在JDK源码中的应用
在早期的 Java 版本中,如果要对指定目录下的文件进行遍历,必须用递归的方式来实现,这种方法复杂且灵活性不高。
Java 7 版本后,Files 类提供了 walkFileTree() 方法,该方法可以很容易的对目录下的所有文件进行遍历,需要 Path、FileVisitor 两个参数。其中,Path 是要遍历文件的路径,FileVisitor 则可以看成一个文件访问器。源码如下。
FileVisitor 提供了递归遍历文件树的支持,这个接口的方法表示了遍历过程中的关键过程,允许在文件被访问、目录将被访问、目录已被访问、发生错误等过程中进行控制。换句话说,这个接口在文件被访问前、访问中和访问后,以及产生错误的时候都有相应的钩子程序进行处理。
FileVisitor 主要提供了 4 个方法,且返回结果的都是 FileVisitResult 对象值,用于决定当前操作完成后接下来该如何处理。FileVisitResult 是一个枚举类,代表返回之后的一些后续操作。源码如下。
FileVisitResult 主要包含 4 个常见的操作。
通过访问者去遍历文件树会比较方便,比如查找文件夹内符合某个条件的文件或者某一天内所创建的文件,这个类中都提供了相对应的方法。它的实现也非常简单,代码如下。
Java 7 版本后,Files 类提供了 walkFileTree() 方法,该方法可以很容易的对目录下的所有文件进行遍历,需要 Path、FileVisitor 两个参数。其中,Path 是要遍历文件的路径,FileVisitor 则可以看成一个文件访问器。源码如下。
- package java.nio.file;
- public final class Files {
- ...
- public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)
- throws IOException
- {
- return walkFileTree(start,
- EnumSet.noneOf(FileVisitOption.class),
- Integer.MAX_VALUE,
- visitor);
- }
- ...
- }
FileVisitor 主要提供了 4 个方法,且返回结果的都是 FileVisitResult 对象值,用于决定当前操作完成后接下来该如何处理。FileVisitResult 是一个枚举类,代表返回之后的一些后续操作。源码如下。
- package java.nio.file;
- import java.nio.file.attribute.BasicFileAttributes;
- import java.io.IOException;
- 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;
- }
- package java.nio.file;
- public enum FileVisitResult {
- CONTINUE,
- TERMINATE,
- SKIP_SUBTREE,
- SKIP_SIBLINGS;
- }
- FileVisitResult.CONTINUE:这个访问结果表示当前的遍历过程将会继续。
- FileVisitResult.SKIP_SIBLINGS:这个访问结果表示当前的遍历过程将会继续,但是要忽略当前文件/目录的兄弟节点。
- FileVisitResult.SKIP_SUBTREE:这个访问结果表示当前的遍历过程将会继续,但是要忽略当前目录下的所有节点。
- FileVisitResult.TERMINATE:这个访问结果表示当前的遍历过程将会停止。
通过访问者去遍历文件树会比较方便,比如查找文件夹内符合某个条件的文件或者某一天内所创建的文件,这个类中都提供了相对应的方法。它的实现也非常简单,代码如下。
- public class SimpleFileVisitor<T> implements FileVisitor<T> {
- protected SimpleFileVisitor() {
- }
- @Override
- public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
- throws IOException
- {
- Objects.requireNonNull(dir);
- Objects.requireNonNull(attrs);
- return FileVisitResult.CONTINUE;
- }
- @Override
- public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
- throws IOException
- {
- Objects.requireNonNull(file);
- Objects.requireNonNull(attrs);
- return FileVisitResult.CONTINUE;
- }
- @Override
- public FileVisitResult visitFileFailed(T file, IOException exc)
- throws IOException
- {
- Objects.requireNonNull(file);
- throw exc;
- }
- @Override
- public FileVisitResult postVisitDirectory(T dir, IOException exc)
- throws IOException
- {
- Objects.requireNonNull(dir);
- if (exc != null)
- throw exc;
- return FileVisitResult.CONTINUE;
- }
- }
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算