zoukankan      html  css  js  c++  java
  • Java 使用FileFilter过滤器对文件进行搜索

    FileFilter概述

    java.io.FileFilter是一个接口,是File的过滤器。
    该接口的对象可以传递给File类的listFiles(FileFilter filter)作为参数,FileFilter接口中只有一个方法。
    boolean accept(File pathname):测试pathname是否应该包含在当前File目录中,符合则返回true。

    FileFilter接口

    public interface FileFilter {
    
        /**
         * 测试指定的抽象路径名是否应包含在路径名列表中。
         *
         * @param  pathname  要测试的抽象路径名
         * @return  <code>true</code> if and only if <code>pathname</code>
         *          should be included
         */
        boolean accept(File pathname);
    }

    举例

    递归查看某文件夹中以.java为后缀的文件

    定义FileFilter接口的实现类,规定筛选规则

    import java.io.File;
    import java.io.FileFilter;
    
    public class FileFilterImp implements FileFilter {
    
        /**
         * 过滤规则:
         *         accept方法中,判断file对象是否是以.java结尾,
         *         如果是,返回true,否则返回false
         * @param pathname file传递过来的路径名称
         * @return true or false
         */
        @Override
        public boolean accept(File pathname) {
            if (pathname.isDirectory()) {
                return true;
            }
            return pathname.getName().endsWith(".java");
        }
    }
     

    定义筛选方法并测试

    import java.io.File;
    import java.io.FileFilter;
    
    public class Demo01FileFilter {
        public static void main(String[] args) {
            File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study/demo29");
            ergodic1(file);
            System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            FileFilterImp filter = new FileFilterImp();
            ergodic2(file, filter);
        }
    
        /**
         * 过滤掉不是.java为后缀的文件名
         * @param file 文件或目录
         */
        public static void ergodic1(File file) {
            // 是否存在该目录或文件
            if (file.exists()) {
                // 存在该目录或文件,获取该目录下的所有目录和文件
                File[] files = file.listFiles();
                // 遍历该目录下的文件或目录
                assert files != null;
                for (File f : files) {
                    // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                    if (f.isDirectory()) {
                        ergodic1(f);
                    } else if (f.getName().endsWith(".java")) {
                        System.out.println(f.getName());
                    }
                }
            } else {
                if (file.isFile()) {
                    System.out.println("不存在该文件");
                } else {
                    System.out.println("不存在该目录");
                }
            }
        }
    
        public static void ergodic2(File file, FileFilter filter) {
            if (file.exists()) {
                File[] files = file.listFiles(filter);
                for (File f : files) {
                    if (f.isDirectory()) {
                        ergodic2(f, filter);
                    } else {
                        System.out.println(f.getName());
                    }
                }
            } else {
                if (file.isFile()) {
                    System.out.println("不存在该文件");
                } else {
                    System.out.println("不存在该目录");
                }
            }
        }
    }

    控制台输出

    FileFilterImp.java
    Demo01FileFilter.java
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    FileFilterImp.java
    Demo01FileFilter.java

    例子优化1:

    // 使用匿名内部类
    
    public class Demo01FileFilter {
        public static void main(String[] args) {
            File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study/demo29");
            ergodic2(
                    file,
                    new FileFilter() {
                        @Override
                        public boolean accept(File pathname) {
                            if (pathname.isDirectory()) {
                                return true;
                            }
                            return pathname.getName().endsWith(".java");
                        }
                    }
            );
    
        }
    }

    控制台输出

    FileFilterImp.java
    Demo01FileFilter.java

    例子优化2:

    import java.io.File;
    
    // 由于FileFilter接口中只有一个抽象方法,所以可以使用Lambda表达式简化
    // 接口实现类,这样也可以不用定义接口实现类,而且比匿名内部类更简洁
    public class Demo02FileFilter {
        public static void main(String[] args) {
            File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study/demo29");
            ergodic(file);
        }
    
        public static void ergodic(File file) {
            if (file.exists()) {
                File[] files = file.listFiles(
                        (File pathname)  -> {return pathname.getName().endsWith(".java") || new File(String.valueOf(pathname)).isDirectory();}
                        );
                assert files != null;
                for (File f : files) {
                    if (f.isDirectory()) {
                        ergodic(f);
                    } else {
                        System.out.println(f.getName());
                    }
                }
            } else {
                if (file.isFile()) {
                    System.out.println("不存在该文件");
                } else {
                    System.out.println("不存在该目录");
                }
            }
        }
    }

    控制台输出

    FileFilterImp.java
    Demo02FileFilter.java
    Demo01FileFilter.java

    其中优化2中还可以进一步优化(对lambda表达式进行优化)

    import java.io.File;
    
    public class Demo03FileFilter {
        public static void main(String[] args) {
            File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study/demo29");
            ergodic(file);
        }
    
        public static void ergodic(File file) {
            if (file.exists()) {
                File[] files = file.listFiles(
                        pathname  -> pathname.getName().endsWith(".java") || new File(String.valueOf(pathname)).isDirectory()
                        );
                assert files != null;
                for (File f : files) {
                    if (f.isDirectory()) {
                        ergodic(f);
                    } else {
                        System.out.println(f.getName());
                    }
                }
            } else {
                if (file.isFile()) {
                    System.out.println("不存在该文件");
                } else {
                    System.out.println("不存在该目录");
                }
            }
        }
    }

    控制台输出

    FileFilterImp.java
    Demo02FileFilter.java
    Demo03FileFilter.java
    Demo01FileFilter.java

             

  • 相关阅读:
    python中get pass用法
    python中get pass用法
    python中get pass用法
    C#委托的介绍(delegate、Action、Func、predicate)
    数据库查询优化的一些总结
    正则表达式的一些基础语法
    w3school上系统过了一遍Jquery的总结
    JavaScript遍历XML总结
    2013学习总结----JavaScript
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/liyihua/p/12250795.html
Copyright © 2011-2022 走看看