由于没有找到俄语的解释性描述,什么
样的野兽
Files.walkFileTree() ,并且通过吱吱声掌握了它(后来证明是一种简单的功能),因此我决定与示例共享材料,作为固定的一部分,我确实很想念。
walkFileTree()方法允许您绕过作为Path元素的参数传递给它的文件和子目录树。
两种方法签名Files.walkFileTree(Path start, FileVisitor<? super Path> visitor); Files.walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);
哪里
路径开始-要绕过目录的目录,
FileVisitor访问者-实现FileVisitor接口或从SimpleFileVisitor()继承的类的实例。 我认为,当您不需要重新定义FileVisitor()的所有方法时,使用后者更为方便,这将在下面进行讨论(但要视情况而定),
设置<\ FileVisitOption>选项-一组用于确定抓取时行为的选项,
maxDepth-子目录通过的深度。
首先,关于迟早会派上用场的参数。maxDepth-遍历深度。 在= 0时,将不执行进入目录的操作,在= MAX_VALUE时,将分别检查目录的最大深度,当maxDepth = 3时,将在“向下”的3个子目录中进行传递。
FileVisitOption-枚举是一个集合,用于确定爬网时程序是否应遵循符号链接(在这种情况下,指定了FileVisitOption.FOLLOW_LINKS值)。
FileVisitor-具有4种方法的接口:
1) FileVisitResult preVisitDirectory(T dir,BasicFileAttributes attrs)引发IOException;包括一组在访问当前子目录之前应遵循的方法。 例如,通过attrs,您可以从以下数据中获取:
lastModifiedTime(),
lastAccessTime(),
creationTime(),
isRegularFile()-如果前面有文件,则为true,
isDirectory()-如果我们有目录,则为true
isSymbolicLink()-如果对象是链接,则为true,
isOther()-如果所讨论的对象既不是文件,目录也不是链接,则为true,
size()-返回对象的大小,并且
fileKey()-返回文件密钥或null;
如果计划在爬网期间计算目录数,则不要忘记起始目录也将被计入总数。
2) FileVisitResult visitFile(T文件,BasicFileAttributes attrs)引发IOException;一组在访问当前文件时应遵循的方法(例如,您可以浏览其内容并查找搜索字符串的出现,或者再次找出上次访问的日期,更改文件或添加要爬网的所有文件的大小以获取目录的大小)
例子 public class MyFileVisitor extends SimpleFileVisitor<Path> { String partOfName; String partOfContent; @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { boolean containsName = true; if(partOfName!=null && !file.getFileName().toString().contains(partOfName)) containsName = false; String content = new String(Files.readAllBytes(file)); boolean containsContent = true; if(partOfContent!=null && !content.contains(partOfContent)) containsContent = false; if(containsName && containsContent) foundFiles.add(file); return FileVisitResult.CONTINUE; }
在此示例中,遍历文件树时,将检查每个文件以同时执行2个事件-文件名是否包含所需的条目,文件是否包含所需字符串的条目。 当两个条件都满足时,文件将添加到结果表中,此后继续爬网;
或visitFile方法重载的另一个
示例 @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if(path.toString().endsWith(".rar") || path.toString().endsWith(".zip")) archived.add(path.toString()); return FileVisitResult.CONTINUE; }
如果是zip或rar存档,则在遍历文件时进行树遍历的程序会将其地址(路径)作为字符串添加到存档文件列表中;
3) FileVisitResult visitFileFailed(T文件,IOException除外)抛出IOException;当访问文件不成功+它“能够”引发异常时,此方法可能会派上用场。 其余的可以通过Override注释来教授。 例如,计算无法访问的文件数;
例子 @Override public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException { failed.add(path.toString()); return FileVisitResult.SKIP_SUBTREE; }
如果尝试访问路径失败,则将该路径作为字符串添加到失败的相似列表中,并且程序继续绕过而不访问其子目录;
4) FileVisitResult postVisitDirectory(T dir,IOException exc)抛出IOException;访问目录后需要做的所有事情都必须作为此方法重载的一部分列出。 例如,通过遍历目录并销毁其中的所有文件,此方法也可以销毁它本身(我们记住,Files.delete(路径dir)仅在目录为空且不包含文件时才删除该目录)。
例子 @Override public FileVisitResult postVisitDirectory(Path path, IOException exc) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; }
通过返回属于枚举集的对象的“访问结果”(FileVisitResult),可以完成上述所有方法,并且可以采用以下值:
CONTINUE
-继续遍历树;TERMINATE
结束树遍历;SKIP_SUBTREE
继续绕过,而不转到该目录;SKIP_SIBLINGS
从此文件或目录的“相对”爬网中排除;