Java:遍历目录

首先

使用Java nio中引入的walkFileTree方法,可以轻松地遍历目录。我将写一篇文章来介绍这个方法,说它多么方便。

嗯,虽然我已经非常清楚现在这么说有点晚了,但是由于我的职场上使用的JRE版本仍然是1.6标准,所以在文件处理方面我仍然使用Java.io类。
自己实现了walkFileTree方法中的Visitor处理逻辑,真的让人很心累…

我想做的事情 (Wǒ zuò de

从C:/Java/jdk1.8.0_102/src提取出C:/Java/jdk1.8.0_102/src/javax/script中的Java文件中的公共类
提取公共类是通过定制功能文章中提到的源代码来完成的。

传递给walkFileTree的Visitor实现

每当我们实现FileVisitor接口时,需要重写其中定义的方法。重点是

    • 戻り値でnullを返すと予期せぬところでNullPointerExceptionが発生するので、FileVisitResultを返すこと

 

    preVisitDirectoryを活用して無駄なファイルの入出力を抑止すること

是吗?

package triple;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

public class DirectroyWalkVistor  implements FileVisitor<Path>{
    private static final String DIRECTORY_ON_TARGET ="C:/Java/jdk1.8.0_102/src/javax/script";

    public static void main(String args[]) throws Exception{
        Files.walkFileTree(Paths.get("C:/Java/jdk1.8.0_102/src"), new DirectroyWalkVistor());
    }

    @Override
    public FileVisitResult postVisitDirectory(Path file , IOException arg1) throws IOException {
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult preVisitDirectory(Path file, BasicFileAttributes arg1) throws IOException {
        if(Paths.get(DIRECTORY_ON_TARGET).startsWith(file)){
            //C:/Java/jdk1.8.0_102/src/javax/scriptに部分一致するときは処理を続ける
            return FileVisitResult.CONTINUE;
        }else{
            //C:/Java/jdk1.8.0_102/src/javax/scriptに部分一致しない時はサブディレクトリの処理をスキップする
            return FileVisitResult.SKIP_SUBTREE;
        }
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes arg1) throws IOException {
        try{
            JavaFileAnalyser.execute(file);
        }catch(Exception e){
            throw new IOException(e);
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException arg1) throws IOException {
        arg1.printStackTrace();
        return FileVisitResult.CONTINUE;
    }
}

印象

非常有趣!这句话可以用来形容它。
由于不需要繁琐的循环或递归处理文件夹,逻辑变得非常简单。