下载地址
链接: https://pan.baidu.com/s/15kiQilp5zQuHf97tBlXYhw 提取码: iprj 复制这段内容后打开百度网盘手机App,操作更方便哦
代码下载完后,大小过滤器代码第24行
if(size >= maxSize && size <= maxSize)改为 if(size >= minSize && size <= maxSize)
文件路径集合:多个url就是多路径筛选,单个url就是单路径筛选
筛选机制: 过滤链(文件大小,文件时间,文件格式)需要筛选什么就加入什么过滤器
策略:多路径文件筛选集合合并,多路径文件筛选集合分离
目录结构:
##过滤器 Filter
FileDateFilter
package com.company.CustomerFileDemo.Filter;
import org.apache.commons.lang3.ObjectUtils;
import java.io.File;
import java.io.FileFilter;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
public class FileDateFilter implements FileFilter {
/**开始时间毫秒数*/
private Long startTime = 0L;
/**结束时间毫秒数*/
private Long endTime = 0L;
public FileDateFilter(Long startTime, Long endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
@Override
public boolean accept(File file) {
if(!ObjectUtils.equals(file, null) && endTime >= startTime){
Long fileDateMillis = getFileDate(file.getAbsolutePath());
System.out.println(fileDateMillis);
endTime = startTime == endTime? startTime: endTime;
if(fileDateMillis >= startTime && fileDateMillis <= endTime){
return true;
}else{
return false;
}
}else {
throw new IllegalArgumentException("该文件路径不存在:" + file.getAbsolutePath());
}
}
private long getFileDate(String url){
File file = new File(url);
try {
Path path= Paths.get(url);
BasicFileAttributeView basicview= Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS );
BasicFileAttributes attr = basicview.readAttributes();
return attr.creationTime().toMillis();
} catch (Exception e) {
e.printStackTrace();
return file.lastModified();
}
}
}
FileSizeFilter
package com.company.CustomerFileDemo.Filter;
import java.io.File;
import java.io.FileFilter;
import java.util.Objects;
public final class FileSizeFilter implements FileFilter {
/**文件最小大小 单位(字节)*/
private Long minSize = 0L ;
/**文件最大大小 单位 (字节)*/
private Long maxSize = 0L;
public FileSizeFilter(Long minSize, Long maxSize) {
this.minSize = minSize;
this.maxSize = maxSize;
}
@Override
public boolean accept(File file) {
if(!Objects.equals(file, null) && maxSize >= minSize){
Long size = file.length();
maxSize = minSize == maxSize? minSize: maxSize;
if(size >= minSize && size <= maxSize){
return true;
}else{
return false;
}
}else {
throw new IllegalArgumentException("该文件路径不存在:" + file.getAbsolutePath());
}
}
}
FileSuffixFilter
package com.company.CustomerFileDemo.Filter;
import org.apache.commons.lang3.ObjectUtils;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
public final class FileSuffixFilter implements FileFilter {
private List<String> suffixs = new ArrayList<>();
public FileSuffixFilter(List<String> suffixs) {
this.suffixs = suffixs;
}
@Override
public boolean accept(File file) {
if(ObjectUtils.notEqual(file, null)){
String suffix = file.getName().substring(file.getName().indexOf(".")+1);
if(suffixs.contains(suffix)){
return true;
}else{
return false;
}
}else{
throw new IllegalArgumentException("该文件路径不存在:" + file.getAbsolutePath());
}
}
}
配置类FileConfiguration
package com.company.CustomerFileDemo;
import java.util.List;
public class FileConfiguration {
/**头路径集合,支持多文件路径过滤*/
private List<String> urls;
/**索引为start的头路径开始扫描url*/
private Integer start;
/**索引为end的头路径为结束扫描url*/
private Integer end;
private FilePolicy filePolicy;
public FileConfiguration(List<String> urls, Integer start, Integer end) {
this(urls, start, end, new FilePolicy.PartStorePolicy());
}
public FileConfiguration(List<String> urls, Integer start, Integer end, FilePolicy filePolicy) {
this.urls = urls;
this.start = start;
this.end = end;
this.filePolicy = filePolicy;
}
public List<String> getUrls() {
return urls;
}
public void setUrls(List<String> urls) {
this.urls = urls;
}
public Integer getStart() {
return start;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getEnd() {
return end;
}
public void setEnd(Integer end) {
this.end = end;
}
public FilePolicy getFilePolicy() {
return filePolicy;
}
public void setFilePolicy(FilePolicy filePolicy) {
this.filePolicy = filePolicy;
}
}
执行过滤链类FileFilterChainExector
package com.company.CustomerFileDemo;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FileFilterChainExector {
private final List<FileFilter> fileFilterList;
private final FileConfiguration fileConfiguration;
public FileFilterChainExector(List<FileFilter> fileFilterList, FileConfiguration fileConfiguration) {
this.fileFilterList = fileFilterList;
this.fileConfiguration = fileConfiguration;
}
public Map<String, List<File>> executor(){
Map<String, List<File>> fileMap = new HashMap<>();
this.fileConfiguration.setEnd(this.fileConfiguration.getEnd()+1 >= this.fileConfiguration.getUrls().size() ? this.fileConfiguration.getUrls().size(): this.fileConfiguration.getEnd()+1);
List<String> urls = this.fileConfiguration.getUrls().subList(this.fileConfiguration.getStart(), this.fileConfiguration.getEnd());
for(String url: urls){
File file = new File(url);
if(!file.exists()){
continue;
}
FileUtils.recursionFile(file, url, this.fileConfiguration.getFilePolicy(), fileMap, this.fileFilterList);
}
return fileMap;
}
}
策略FilePolicy
package com.company.CustomerFileDemo;
import org.apache.commons.lang3.ObjectUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public interface FilePolicy {
void executor(String url, File file, Map<String,List<File>> fileMap);
/**
* 所有头路径所扫描到满足的文件分开存,key为头路径,value是满足的文件数组
*/
public static class PartStorePolicy implements FilePolicy{
public void executor(String url, File file,Map<String,List<File>> fileMap){
if(ObjectUtils.notEqual(fileMap.get(url), null)){
List<File> fileList = fileMap.get(url);
fileList.add(file);
}else {
List<File> fileList = new ArrayList<>();
fileList.add(file);
fileMap.put(url, fileList);
}
}
}
/**
* 将所有头路径扫描到的文件放在同一个集合里
*/
public static class MergeStorePolicy implements FilePolicy{
public void executor(String url, File file,Map<String,List<File>> fileMap){
if(ObjectUtils.notEqual(fileMap.get(url), null)){
List<File> fileList = fileMap.get(url);
fileList.add(file);
// fileMap.entrySet().
fileMap.entrySet().stream().reduce((target, source )-> {
target.getValue().addAll(source.getValue());
return target;
});
}else {
List<File> fileList = new ArrayList<>();
fileList.add(file);
fileMap.put(url, fileList);
}
}
}
}
工具FileUtils
package com.company.CustomerFileDemo;
import java.io.File;
import java.io.FileFilter;
import java.util.List;
import java.util.Map;
public class FileUtils {
public static void recursionFile(File file, String startUrl, FilePolicy filePolicy, Map<String, List<File>> map, List<FileFilter> fileFilterList){
if(!file.exists()){
throw new IllegalArgumentException("该文件不存在:" + file.getAbsolutePath());
}else{
if(file.isFile() && chainExecutor(file, fileFilterList)){
filePolicy.executor(startUrl, file, map);
}else if(file.isDirectory()){
for(File fileTemp: file.listFiles()){
recursionFile(fileTemp, startUrl, filePolicy, map, fileFilterList);
}
}
}
}
public static boolean chainExecutor(File file, List<FileFilter> fileFilterList){
for(FileFilter fileFilter: fileFilterList){
if(!fileFilter.accept(file)){
return false;
}
}
return true;
}
}
管理器FilterManager
package com.company.CustomerFileDemo;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class FilterManager {
private final static List<FileFilter> fileFilters = new ArrayList<>();
private FileFilterChainExector fileFilterChainExector = null;
public FilterManager(FileConfiguration fileConfiguration){
this.fileFilterChainExector = new FileFilterChainExector(fileFilters, fileConfiguration);
}
public void addFilter(FileFilter fileFilter){
this.fileFilters.add(fileFilter);
}
public Map<String, List<File>> startAndGet(){
return this.fileFilterChainExector.executor();
}
}
测试代码
package com.company.CustomerFileDemo;
import com.company.CustomerFileDemo.Filter.FileDateFilter;
import com.company.CustomerFileDemo.Filter.FileSizeFilter;
import com.company.CustomerFileDemo.Filter.FileSuffixFilter;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
testDate();
}
public static void test(){
List<String> urls = new ArrayList<>();
urls.add("D:/ESL");
FileConfiguration fileConfiguration = new FileConfiguration(urls, 0,0);
FilterManager filterManager = new FilterManager(fileConfiguration);
Map<String,List<File>> map = filterManager.startAndGet();
System.out.println(map);
}
public static void testSize(){
List<String> urls = new ArrayList<>();
urls.add("D:/ESL");
FileFilter fileFilter = new FileSizeFilter(1L, 1765L);
FileConfiguration fileConfiguration = new FileConfiguration(urls, 0,0);
FilterManager filterManager = new FilterManager(fileConfiguration);
filterManager.addFilter(fileFilter);
Map<String,List<File>> map = filterManager.startAndGet();
System.out.println(map);
}
public static void testSuffix(){
List<String> urls = new ArrayList<>();
urls.add("D:/ESL");
List<String> suffixs = new ArrayList<>();
suffixs.add("img");
FileFilter fileFilter = new FileSuffixFilter(suffixs);
FileConfiguration fileConfiguration = new FileConfiguration(urls, 0,0);
FilterManager filterManager = new FilterManager(fileConfiguration);
filterManager.addFilter(fileFilter);
Map<String,List<File>> map = filterManager.startAndGet();
System.out.println(map);
}
public static void testDate(){
List<String> urls = new ArrayList<>();
urls.add("D:/ESL");
FileFilter fileFilter = new FileDateFilter(1000l,1616995920707L);
FileConfiguration fileConfiguration = new FileConfiguration(urls, 0,0);
FilterManager filterManager = new FilterManager(fileConfiguration);
filterManager.addFilter(fileFilter);
Map<String,List<File>> map = filterManager.startAndGet();
System.out.println(map);
}
public static void testAll(){
List<String> urls = new ArrayList<>();
urls.add("D:/ESL");
FileFilter fileFilter1 = new FileSizeFilter(1L, 1765L);
FileFilter fileFilter2 = new FileDateFilter(1000l,1616995920707L);
List<String> suffixs = new ArrayList<>();
suffixs.add("img");
FileFilter fileFilter3 = new FileSuffixFilter(suffixs);
FileConfiguration fileConfiguration = new FileConfiguration(urls, 0,0);
FilterManager filterManager = new FilterManager(fileConfiguration);
filterManager.addFilter(fileFilter1);
filterManager.addFilter(fileFilter2);
filterManager.addFilter(fileFilter3);
Map<String,List<File>> map = filterManager.startAndGet();
System.out.println(map);
}
}