【一】需求
查找某個指定目錄下,創建日期在指定日期之前,且開頭為指定前綴,結尾為指定類型,大小大于指定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 閱讀(3169)
評論(1) 編輯 收藏 所屬分類:
J2SE