引言
当我们在使用java的类作为参数时,经常会需要重写这个类中的某些方法。这个时候通常有两种方法:一是我们写一个类继承这个类并重写需要重写的方法,传参时用子类。二是使用匿名内部类的方式重写其方法,也可以达到相同的效果,并且代码更加简洁。在这里第一种方法就不说了,重点看看第二种方法是怎么个用法 。
一个NIO处理目录树的例子
目录树意味着一个目录里既有文件也有子目录,也可能都没有,也可能有其一。NIO 2.0 可以很方便地遍历一颗目录树,并操作符合条件的文件;这其中关键的一个方法就是 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);
}
第二个参数 FileVisitor 被称为文件访问器接口,它实现起来非常复杂,要实现 5 个方法呢,但幸好 JDK 的设计者提供了一个默认的实现类 SimpleFileVisitor,如果我们只想从目录树中找到 txt 后缀的文件,可以这样做:
// 相对路径
Path dir = Paths.get("chenmo");
try {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".txt")) {
System.out.println(file.getFileName());
}
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
通过创建匿名内部类来重写 SimpleFileVisitor 的 visitFile 方法,如果后缀名为 txt 就打印出来。