FileFilter和FilenameFilter用法及区别

概述

FileFilterFilenameFilter 这两个接口用来实现过滤文件的功能。如果你厌倦了写无数个for循环去遍历过滤你想要的文件。
那么这两个接口将是非常不错的选择。实现接口的方法,或者使用Java8的Lamdba表达式进行优雅的过滤。Is't perfect。

FileFilter

package java.io;

@FunctionalInterface
public interface FileFilter {
    boolean accept(File pathname);
}

FileFilter 是一个接口,用来接收一个文件,然后根据需求进行过滤,符合要求的文件返回 true,否则返回 false

FilenameFilter

package java.io;

@FunctionalInterface
public interface FilenameFilter {
    boolean accept(File dir, String name);
}

FilenameFilter 也是一个接口,与 FileFilter 接口不同的是参数不同。
它接收一个文件目录,和一个文件名。然后进行过滤,符合要求的返回 true,否则返回 false
这两个接口参数之间的关系如下:

dir = pathname.getParentFile();
name = pathname.getName();

测试代码

package cn.sjzmqx.io;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.Optional;

/**
 * 文件过滤器:
 * FileFilter: accept(File file)
 * FilenameFilter: accept(File dir, String name)
 * <p>
 * 两者的区别在于参数不同。
 * FileFilter的参数file代表的是文件。
 * FilenameFilter的参数dir代表的是目录,name代表的是文件名。
 * <code>file = dir + name;</code>
 * <p>
 * 总结:FileFilter偏向于过滤文件,FilenameFilter偏向于过滤文件名和文件所在的上级目录。
 */
public class TestFileFilter {

    public static String dir = "F:" + File.separator + "mqx" + File.separator + "image";

    public static void main(String[] args) {
        // 通过lamdba实现FileFilter,过滤图片
        File[] imgs1 = new File(dir).listFiles((file) -> {
            if (file.getName().endsWith(".jpg")
                    || file.getName().endsWith(".png")
                    || file.getName().endsWith(".gif")) {
                return true;
            } else {
                return false;
            }
        });

        // 通过Lamdab实现FilenameFileter,过滤图片
        File[] imgs2 = new File(dir).listFiles((dir, name) -> {
            if (name.endsWith(".jpg")
                    || name.endsWith(".png")
                    || name.endsWith(".gif")) {
                return true;
            } else {
                return false;
            }
        });

        // 通过FileFilter实现类过滤图片。
        File[] imgs3 = new File(dir).listFiles(new ImageFileFilter());

        // 通过FilenameFilter实现类过滤图片。
        File[] imgs4 = new File(dir).listFiles(new ImageFilenameFilter());

        // 关于Java8 Optional的用法后面会讲。
        System.out.println("  通过Lamdba实现FileFilter:");
        Optional.ofNullable(imgs1).ifPresent((imgs) -> {
            Arrays.stream(imgs).forEach((file -> System.out.println("      " + file.getAbsolutePath())));
        });

        System.out.println("  通过Lamdba实现FilenameFilter:");
        Optional.ofNullable(imgs2).ifPresent((imgs) -> {
            Arrays.stream(imgs).forEach((file -> System.out.println("      " + file.getAbsolutePath())));
        });

        System.out.println("  通过FileFilter实现类过滤图片:");
        Optional.ofNullable(imgs3).ifPresent((imgs) -> {
            Arrays.stream(imgs).forEach((file -> System.out.println("      " + file.getAbsolutePath())));
        });

        System.out.println("  通过FilenameFilter实现类过滤图片:");
        Optional.ofNullable(imgs4).ifPresent((imgs) -> {
            Arrays.stream(imgs).forEach((file -> System.out.println("      " + file.getAbsolutePath())));
        });
    }


    /**
     * 图片过滤器 FileFilter
     */
    public static class ImageFileFilter implements FileFilter {
        @Override
        public boolean accept(File pathname) {
            if (pathname.getName().endsWith(".jpg")
                    || pathname.getName().endsWith(".png")
                    || pathname.getName().endsWith(".gif")) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 图片过滤器 FilenameFilter
     */
    public static class ImageFilenameFilter implements FilenameFilter {
        @Override
        public boolean accept(File dir, String name) {
            if (name.endsWith(".jpg")
                    || name.endsWith(".png")
                    || name.endsWith(".gif")) {
                return true;
            } else {
                return false;
            }
        }
    }
}

文件过滤输出结果.png

posted @ 2020-01-06 14:57  78KgMiao  阅读(883)  评论(0)    收藏  举报