FileFilter和FilenameFilter用法及区别
概述
FileFilter 和 FilenameFilter 这两个接口用来实现过滤文件的功能。如果你厌倦了写无数个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;
}
}
}
}

78KgMiao

浙公网安备 33010602011771号