zoukankan      html  css  js  c++  java
  • 使用nio遍历文件夹

    1、递归方式:

    private static void print(File f){
            if(f!=null){
                if(f.isDirectory()){
                    File[] fileArray=f.listFiles();
                    if(fileArray!=null){
                        for (int i = 0; i < fileArray.length; i++) {
                            //递归调用
                            print(fileArray[i]);
                        }
                    }
                }
                else{
                    System.out.println("文件为:"+f.getName())
                }
            }
        }

    2、nio方式

    /**
         * nio遍历文件夹下面所有的文件
         * @return
         * @throws IOException
         */
        private static List<File> getFiles(String path) throws IOException {
            List<File>files = new ArrayList<>();
            Files.walkFileTree( Paths.get(path),new SimpleFileVisitor<Path>(){
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
    //                System.out.println("正在访问:" + dir + "目录");
                    return FileVisitResult.CONTINUE;
                }
    
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    //                System.out.println("	正在访问" + file + "文件");
                    files.add(file.toFile());
                    return super.visitFile(file, attrs);
                }
    
            });
            return  files;
        }

    !!注意,里面的文件和目录要区别开;

    !可以看到它是一个模板接口,但是在walkFileTree中它的类型已经确定了就是Path,因此里面的T类型就是Path类型了;

            iv. 接口方法的返回值FileVisitResult是一个枚举类型,walkFileTree就是会根据这个返回值决定是否要继续遍历下去,如果要继续遍历则应该怎样遍历,它总共有4个枚举值:都是FileVisitResult中定义的枚举值

    CONTINUE:继续遍历

    SKIP_SIBLINGS:继续遍历,但忽略当前节点的所有兄弟节点直接返回上一层继续遍历

    SKIP_SUBTREE:继续遍历,但是忽略子目录,但是子文件还是会访问;

    TERMINATE:终止遍历

    实际使用中通常直接继承FileVisitor的适配器SimpleFileVisitor,因为只需要实现你感兴趣的方法即可,无需4个方法全部都实现;

    !!Path可以像String那样进行字符串校验,校验路径中的字符串:都是Path的对象方法

            a. boolean startsWith(String other); // 前缀检查

            b. boolean startsWith(Path other);

            c. boolean endsWith(String other); // 后缀检查

            d. boolean endsWith(Path other);

    !!比较的都是其path成员字符串里的内容,并不会深入文件系统用完整的绝对路径来比较

  • 相关阅读:
    gbk学习笔记
    在freebsd下编译nodejs,出现无法找到execinfo.h头文件的错误
    php 截取GBK文档某个位置开始的n个字符
    linux下,phpstorm配置oracle jdk
    gb2312学习笔记
    freebsd下vim默认的vi操作方式太难用,可通过启用vim自带配置文件解决
    freebsd通过ssh远程登陆慢,用户认证时间长解决办法
    php输出全部gb2312编码内的汉字
    visibility:hidden 与 display:none 的区别
    java 实现文件/文件夹复制、删除、移动(二)
  • 原文地址:https://www.cnblogs.com/cq-yangzhou/p/10697550.html
Copyright © 2011-2022 走看看