【一】需求
查找某个指定目录下,创建日期在指定日期之前,且开头为指定前缀,结尾为指定类型,大小大于指定size的文件。例如:查找我本地磁盘上位于:E:\Other\Picture\私人 目录下,创建日期在2010年1月2日之前,开头为IMG_、DSCN,类型为JPG、GIF,且大小超过2M的图片资源文件。
【二】简介
1.基本功能过滤器
=============================================
①类型:DirectoryFileFilter、FileFileFilter
②大小:EmptyFileFilter、SizeFileFilter
③时间:AgeFileFilter
④名称:NameFileFilter、PrefixFileFilter、SuffixFileFilter、RegexFileFilter、WildcardFileFilter
⑤读写属性:CanReadFileFilter、CanWriteFileFilter
⑥隐藏属性:HiddenFileFilter
2.逻辑关系过滤器
=============================================
①逻辑与:AndFileFilter
②逻辑或:OrFileFilter
③逻辑非:NotFileFilter
④永真/假:TrueFileFilter、FalseFileFilter
3.过滤器容器
=============================================
①工具类:FileFilterUtils
【三】思路
①使用递归方法遍历所有目录
②采用FileFilter定义的各种类型进行组合
具体思路通过阅读代码可以知道
【四】代码
package example.io;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.apache.commons.io.DirectoryWalker;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.AgeFileFilter;
import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.SizeFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;


public class ImageFileFilter
{

private PrefixFileFilter prefixF;

private SuffixFileFilter suffixF;

private AgeFileFilter ageF;

private SizeFileFilter sizeF;


public static void main(String args[])
{
ImageFileFilter filter = new ImageFileFilter();

// Set cutoff date
Calendar instance = Calendar.getInstance();
instance.set(2010, Calendar.JANUARY, 1, 23, 59, 59);
filter.setFileAge(instance.getTime(), true);

// Set prefix
List<String> prefixs = new ArrayList<String>();
prefixs.add("IMG_");
prefixs.add("DSCN");
filter.setFilePrefix(prefixs);

// Set suffix
List<String> suffixs = new ArrayList<String>();
suffixs.add(".jpg");
suffixs.add(".gif");
filter.setFileSuffix(suffixs);

// Set size
filter.setFileSize(1024 * 1024 * 2);

// Union filter conditions
File baseDir = new File("E:/Other/Picture/私人/");
IOFileFilter fullConditions = new AndFileFilter(filter.unionFilters());
filter.search(baseDir, fullConditions);
}


public void search(File baseDir, FileFilter fullConditions)
{
ImageSearcher searcher = new ImageSearcher(baseDir,
(IOFileFilter) fullConditions);
Thread searchThread = new Thread(searcher);
searchThread.start();


try
{
searchThread.join(); // child thread join to main thread

} catch (InterruptedException e)
{
e.printStackTrace();
}
searcher.displaySearchResult();
}

// ============== Methods to construct kinds of filters ==============


public void setFilePrefix(List<String> prefix)
{
prefixF = new PrefixFileFilter(prefix, IOCase.SYSTEM);
}


public void setFileSuffix(List<String> suffix)
{
suffixF = new SuffixFileFilter(suffix, IOCase.SYSTEM);
}


public void setFileAge(Date cutoffDate)
{
ageF = new AgeFileFilter(cutoffDate);
}


public void setFileAge(Date cutoffDate, boolean acceptOlder)
{
ageF = new AgeFileFilter(cutoffDate, acceptOlder);
}


public void setFileSize(long size)
{
sizeF = new SizeFileFilter(size);
}


public void setFileSize(long size, boolean acceptLarger)
{
sizeF = new SizeFileFilter(size, acceptLarger);
}


private List<FileFilter> unionFilters()
{
List<FileFilter> allFilters = new ArrayList<FileFilter>();
allFilters.add(prefixF);
allFilters.add(suffixF);
allFilters.add(ageF);
allFilters.add(sizeF);
return allFilters;
}

// ============ Inner class to do search task ================


class ImageSearcher extends DirectoryWalker implements Runnable
{

private volatile boolean cancelled = false;

private File basePath;

private List<String> finalResult = new ArrayList<String>();

private long startTime;

private long endTime;


public ImageSearcher(File basePath, IOFileFilter filter)
{
super(FileFilterUtils.directoryFileFilter(), filter, -1);
this.basePath = basePath;
}


public void run()
{
filter();
}


public void filter()
{
List<String> result = new ArrayList<String>();

try
{
startTime = new Date().getTime();
walk(basePath, result);

} catch (IOException e)
{
e.printStackTrace();
}
endTime = new Date().getTime();
finalResult = result;
}


public List<String> getResult()
{
return finalResult;
}


/** *//**
* Display search result.
*/

public void displaySearchResult()
{
String s = null;
System.out.println("\n=======================================");

for (int i = 0; i < finalResult.size(); i++)
{
s = (String) finalResult.get(i);
System.out.println(" Image file found: " + s);
}
int size = finalResult.size();
long elapsed = endTime - startTime;
System.out.println("\nFinally found items: " + size);
System.out.println("\nTime costing(ms) on searching: " + elapsed);
System.out.println("=======================================\n");
}

protected boolean handleDirectory(File directory, int depth,

Collection results) throws IOException
{
return true;
}

protected void handleFile(File file, int depth, Collection results)

throws IOException
{
StringBuffer sb = new StringBuffer(file.getAbsolutePath());
sb.append("------");
sb.append(FileUtils.byteCountToDisplaySize(file.length()));
results.add(sb.toString());
}


public void cancel()
{
cancelled = true;
}

protected boolean handleIsCancelled(File file, int depth,

Collection results)
{
return cancelled;
}

protected void handleCancelled(File startDirectory, Collection results,

CancelException cancel)
{

if (cancelled)
{
cancel();
}
System.out.println("\nCancelled by external or interal thread");
finalResult = (List<String>) results;
}

}

}

【四】实验结果
这个目录下有23个子目录,3452张图片
=======================================
... ...
Image file found: E:\Other\Picture\私人\2009-雕塑公园\IMG_4968.JPG------2 MB
Image file found: E:\Other\Picture\私人\2009-雕塑公园\IMG_4977.JPG------3 MB
Image file found: E:\Other\Picture\私人\2009-雕塑公园\IMG_4992.JPG------4 MB
Image file found: E:\Other\Picture\私人\2009-雕塑公园\IMG_5001.JPG------3 MB
Image file found: E:\Other\Picture\私人\2009-雕塑公园\IMG_5010.JPG------2 MB
Finally found items: 1662
Time costing(ms) on searching: 26125
=======================================
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2010-04-01 17:52
Paul Lin 阅读(3165)
评论(1) 编辑 收藏 所属分类:
J2SE