• commons-io监听文件改动


    1.基本功能过滤器
    =============================================
    ①类型:DirectoryFileFilter、FileFileFilter
    ②大小:EmptyFileFilter、SizeFileFilter
    ③时间:AgeFileFilter
    ④名称:NameFileFilter、PrefixFileFilter、SuffixFileFilter、RegexFileFilter、WildcardFileFilter
    ⑤读写属性:CanReadFileFilter、CanWriteFileFilter
    ⑥隐藏属性:HiddenFileFilter
    2.逻辑关系过滤器
    =============================================
    ①逻辑与:AndFileFilter
    ②逻辑或:OrFileFilter
    ③逻辑非:NotFileFilter
    ④永真/假:TrueFileFilter、FalseFileFilter
    3.过滤器容器
    =============================================
    ①工具类:FileFilterUtils
     
    【三】思路
     
    ①使用递归方法遍历所有目录
    ②采用FileFilter定义的各种类型进行组合
     
    具体思路通过阅读代码可以知道
     
     
    1. IOFileFilter接口
     
     
    这个接口就是分别实现了FileFilter和FilenameFilter这个两个接口,作为最上层的
    接口,这个在后面的所有的filefilter里面可能都会实现这个接口
     
    2. ConditionalFileFilter接口
     
     
    这个接口从名字上可以看出来就是对一系列的FileFilter做操作,然后实际上就是实现了
    对IOFileFilter的增,删,查和设置操作。其实我们应该能想到得是肯定会有子类去实现这个
    接口来实现一些FileFilter的组合逻辑。比如And,Or等等,我们下面就会看到。
     
    3.AbstractFileFilter抽象类
     
     
    这个类其实也没什么,主要是实现了IOFileFilter,但是这个实现稍微有点技巧,就是
    类被标记成abstract了,但是方法都是实现了,在类的注释里面也写的很清楚,就是子类
    必须实现其中一个方法,负责就陷入到死循环中去了,我们来稍微看一下吧。
     
     public boolean accept(File file) {
            return accept(file.getParentFile(), file.getName());
        }
      这个实际上是FileFilter的实现,它调用了FilenameFilter的实现。
     
     
    public boolean accept(File dir, String name) {
            return accept(new File(dir, name));
        }
    这个实际上是FilenameFilter的实现,它调用了FileFilter的实现。
     
    所以这个就有了像注释里面说的,如果不实现其中一个就会陷入到死循环之中。
     
    4. AgeFileFilter类的理解
     
     
    这个类比较好理解,实际上就是用户可以指定一个时间,然后选出来这个时间点新或者旧
    的文件,由acceptOlder这个标志位进行标记。这个实现我想大家应该自己都会写,就是
    取得当前文件的最后修改时间,然后和用户传近来的时间点做比较,再根据acceptOlder标志位来看看应该accept。
     
    5. CanReadFileFilter类的理解
     
     
    这个类比较好理解,从类名上我们就可以看出就是实现对文件的canRead的一个筛选,
    这个不多讲了,大家都会明白的。
     
    6. CanWriteFileFilter类的理解
     
    这个类也比较好理解,从类名上我们可以看出就是实现对文件的canWrite的一个筛选,
    这个也不多讲了,大家都很明白。
     
     
    7. DelegateFileFilter类的理解
    从这个类的命名上我们就可以看出,这个类的意图是实现delegate操作的,这个类是实现
    IOFileFilter的,那么在这个实现类里面就肯定要传近来两个delegate,一个是FileFilter,
    一个是FilenameFilter,然后调用delegate的accept方法,如果某一个FileFilter是null
    的时候就调用父类的就行了。
     
    8. DirectoryFileFilter类的理解
    从这个类的命名上我们也可以看出,就是为了实现筛选目录功能的,肯定在实现的时候会调用File的isDirectory方法就行了。
     
    9. EmptyFileFilter类的理解
    从这个类的命名上我们也可以看出,就是来判断File或者Directory是不是empty,对于目录来说,是判断它底下有没有file,当然也包括directory了,对于file来说就是判断它的length是不是010. FalseFileFilter类的理解
    这个类最好理解了,就是两个accept方法都返回false,做的比较绝情,真不知道在什么场景下用。
     
    11. FalseFileFilter类的理解
    这个类也很好理解,就是在accept方法里面判断文件是不是File类型,然后将结果返回
     
    12. HiddenFileFilter类的理解
    这个类也很好理解,就是在accept方法里面判断文件是不是隐藏文件,这个就不多说了
     
    13. NameFileFilter类的理解
    这个类的意图如果我们看类名的话估计是会因为它实现的是和FilenameFilter差不多,其实不然。
    这个类主要是实现了,以指定的Name或者Name[]来进行Filter文件的功能。其实还有一个就是大家
    看到Name应该就会想到Case Sentivity的问题,所以在这里,作者已经想到了,就是会传递一个
    IOCase进来,可以指定是否大小写敏感。
     
    下面的例子中给出了它的典型应用
    File dir = new File(".");
     String[] files = dir.list( new NameFileFilter("Test") );
     for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
     }
     
    我想我们应该能想到它是怎么实现的,不过还是稍微看一些它的代码:
     
    public boolean accept(File file) {
            String name = file.getName();
            for (int i = 0; i < this.names.length; i++) {
                if (caseSensitivity.checkEquals(name, names[i])) {
                    return true;
                }
            }
            return false;
        }
    就是拿到文件名,然后遍历传递过来的文件数组进行循环,再使用CaseSessiontity进行判断,
    如果有一个满足跳进啊,就直接返回。
     
    14. NotFileFilter类的学习
     
    这个类从名字上我们可以看出就是实现FileFilter的Not操作,但是稍微有点不同的是,就是对代理的FileFilter做非操作。这个就不仔细讲了,大家都明白。
     
    15. OrFileFilter类的学习
     
    这个类的名字是实现ConditiaonalFileFilter的,也就是对一系列的FileFilter实现或逻辑,
    如果有一个满足条件,那么就返回。我就不贴代码了。我们可以想一下,如果让我们来实现这个的话,应该是什么样子的,肯定是要用一个List来保持要进行Or操作的所有的FileFilter了,然后就是可以要实现对这个List的add,remove,get和获得操作,然后在最重要的accept方法里面会遍历这个List进行accept操作,然后又符合要求的就直接返回。
     
    16. PrefixFileFilter类的学习
     
    这个类的意图感觉从名字上可以清晰地看出来,就是根据文件的前缀进行Filter文件,那么提到这个我们应该能想到这个应该是CaseSensitivity的。我们应该也能想到,就是这个在构造函数里面应该要传递一个筛选的Prefix数组进行filter,所以这个类的大体框架也就有了,就是一个IOCase,一个用于过滤的prefix数组,具体的实现逻辑我就不讲了,感觉稍微想一下,看看我们如果写的是怎么实现,它现在是怎么说实现的,然后比较一下我感觉会有帮助的。
     
    17. RegexFileFilter类的学习
     
    这个类我们从名字上应该能看出来意图,主要是接收一个Pattern,然后再根据文件名来判断是不是
    和当前的Pattern里面是不是匹配,这个也很好理解。
    只给我一个使用实例吧:
     
    File dir = new File(".");
     FileFilter fileFilter = new RegexFileFilter("^.*[tT]est(-\d+)?\.java$");
     File[] files = dir.listFiles(fileFilter);
     for (int i = 0; i < files.length; i++) {
       System.out.println(files[i]);
     }
     
     
    18. SizeFileFilter类的学习
    这个类从命名上就可以看出它第意图,就是根据文件的大小来进行筛选文件。那么如果我们来实现这个功能的话,肯定是要有两个很重要的参数,一个是可接受的大小,一个是满足条件的是比传入的值大,还是小。 它也是这么实现的,一个是size属性,一个是acceptLarger属性,所以这个的实现我想大家应该也明白了,就不多讲了。
     
    19. SuffixFileFilter类的学习
     
    这个类从命名上也很容易看到它的意图,就是根据suffix来进行对文件的过滤,这个肯定是对文件进行过滤的,所以如果是文件名是以suffix提供的文件名结束的就返回。
     
    20. TrueFileFilter类的学习
     
    这个类实现的特别简单,关键不知道有什么用,两个都返回true,那和不是有FileFilter有什么区别呢,不懂。
     
    21. WildcardFileFilter类的学习
    这个类应该是整个FileFilter体系里面最复杂的一个类了。我们来好好看一下这个类,然后做一个总结。 今天脑子有点晕这个就不讲了,感觉还比较复杂,等哪天清晰了再分析,今天不行了,脑子转不过来了。
    

    转:https://blog.csdn.net/kjfcpua/article/details/8548137

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    html概述
    html元素之meta
    ICMP
    https
    html元素之link
    数据链路层
    UDP
    js概述
    html元素之base
    vagrant和virtualbox无法创建软连接(failed to create symbolic link : Protocol error)
  • 原文地址:https://www.cnblogs.com/javayida/p/13347025.html
Copyright © 2020-2023  润新知