美文网首页
java7新特性3——目录与目录树遍历

java7新特性3——目录与目录树遍历

作者: 不迷失 | 来源:发表于2017-04-01 20:25 被阅读204次

    虽然现在都使用Java8了,但是Java7的新特性你是否都知道了呢?

    1f2f7374e1990b4bb551fd141bc4a53d1f2f7374e1990b4bb551fd141bc4a53d

    Java7之前,虽然能做到遍历目录与目录树,但比较麻烦,需要自己编码。

    新的IO基于Path提供了方便的目录与目录树遍历及过滤等,非常简单方便。

    目录遍历

    通过Files的工具方法,可以获取某个path对应的DirectoryStream接口,通过此接口就能遍历改path下面(直接子path)的项目。

          ​Path dir= Paths.get("f:\\");
            //得到改path的目录流接口
            DirectoryStream<Path> directoryStream = Files.newDirectoryStream(dir);
          
            for(Path item : directoryStream){
                System.out.println(item.toAbsolutePath()+":"+item.getFileName());
            }
    
    也可以方便的过滤某些形式的文件,如:
         ​    ​//得到改path下所有.txt文件的目录流接口
            DirectoryStream<Path> txtStream=Files.newDirectoryStream(dir,"*.txt");
    
            System.out.println("===txt===");
    
            for(Path item : txtStream){
                System.out.println(item.toAbsolutePath()+":"+item.getFileName());
            }
            
    

    目录树遍历

    新的api支持递归的遍历整改目录下的所有目录及文件。

    通过Files.walkFileTree(path,fileVisittor))即可实现。

    第一个参数是要遍历的path

    第二个参数是一个遍历过程中的处理接口FileVisitor。它提供了遍历文件树的各种操作:

    • preVisitDirectory - 一个路径被访问时调用

    • PostVisitDirectory - 一个路径的所有节点被访问后调用。如果有错误发生,exception会传递给这个方法

    • visitFile - 文件被访问时被调用。该文件的文件属性被传递给这个方法

    • visitFileFailed - 当文件不能被访问时,此方法被调用。Exception被传递给这个方法。

      如果你不想实现所有方法,你可以选择继承 SimpleFileVisitor。它帮你实现了上述方法,你只需重写你感兴趣的方法。

    一个实例:

    package java7;
    
    import java.io.IOException;
    import java.nio.file.*;
    import java.nio.file.attribute.BasicFileAttributes;
    
    /**
     * 使用Java7提供的api进行目录及目录树遍历
     * @author qiang.xie
     * @date 2017/3/29
     */
    public class DirList {
    
        public static void main(String[] arg) throws IOException {
            Path dir= Paths.get("f:\\");
            //得到改path的目录流接口
            DirectoryStream<Path> directoryStream = Files.newDirectoryStream(dir);
    
            for(Path item : directoryStream){
                System.out.println(item.toAbsolutePath()+":"+item.getFileName());
            }
    
    
            //得到改path下所有.txt文件的目录流接口
            DirectoryStream<Path> txtStream=Files.newDirectoryStream(dir,"*.txt");
    
            System.out.println("===txt===");
    
            for(Path item : txtStream){
                System.out.println(item.toAbsolutePath()+":"+item.getFileName());
            }
    
            System.out.println("===dir tree===");
    
    
            Files.walkFileTree(dir,new VisitorFile());
    
    
        }
    
        static class VisitorFile extends SimpleFileVisitor<Path>{
            //访问目录及子目录中的每个path的方法
            @Override
            public FileVisitResult visitFile(Path file,BasicFileAttributes attrs) throws IOException {
                System.out.println(file.toAbsolutePath()+":"+file.getFileName());
                //表示继续遍历
                return FileVisitResult.CONTINUE;
            }
    
    
            //访问某个path失败时调用的方法,默认抛出异常
            @Override
            public FileVisitResult visitFileFailed(Path file,IOException exc) throws IOException {
                System.out.println(file+";"+exc.getClass());
                //表示继续遍历
                return FileVisitResult.CONTINUE;
            }
        }
    }
    
    

    --

    @不迷失|知识改善生活

    专注技术研究与视频教学,分享有价值的技术与经验,关注程序员的发展!

    --
    @不迷失技术博客

    微信公众号:java技术(javajidi_com)

    技术交流群:245130488

    --

    教学视频

    QQ课堂

    百度传课

    相关文章

      网友评论

          本文标题:java7新特性3——目录与目录树遍历

          本文链接:https://www.haomeiwen.com/subject/zpkwottx.html