【一】DirectoryWalker介紹
在日常的操作中,我們經常需要對某個目錄下的資源進行遍歷。比如說:遍歷工程目錄,找出所有.svn的目錄并進行刪除。這時我們如果使用前面的File filter,將不能做到遞歸的效果。于是Apache commons IO提供了一個用于遍歷目錄進行操作的抽象類:DirectoryWalker。
Abstract class that walks through a directory hierarchy and provides subclasses with convenient hooks to add specific behaviour.
This class operates with a FileFilter and maximum depth to limit the files and direcories visited. Commons IO supplies many common filter implementations in the filefilter package.
【二】DirectoryWalker實戰
在這個類的API中,作者演示了如何使用這個類來刪除指定目錄下的所有文件和.svn目錄,并返回已刪除的文件

public class FileCleaner extends DirectoryWalker
{


public FileCleaner()
{
super();
}


public List clean(File startDirectory)
{
List results = new ArrayList();
walk(startDirectory, results);
return results;
}


protected boolean handleDirectory(File directory, int depth, Collection results)
{
// delete svn directories and then skip

if (".svn".equals(directory.getName()))
{
directory.delete();
return false;

} else
{
return true;
}

}


protected void handleFile(File file, int depth, Collection results)
{
// delete file and add to list of deleted
file.delete();
results.add(file);
}
}
要使用DirectoryWalker來遍歷一個目錄并進行相應的操作,步驟如下:
①創建一個繼續于DirectoryWalker的類,并在構造方法中調用super();
②定義一個業務入口方法,例如clean。在這個方法中調用walk方法
③覆蓋DirectoryWalker類的handleDirectory方法,提供相應的處理邏輯
④覆蓋DirectoryWalker類的handleFile方法,提供相應的處理邏輯
其中的關鍵在于walk方法,這個方法指定了入口的路徑,并提供一個用于接收處理結果的參數。在這個方法的內部,它遞歸地對每一個目錄對象調用handleDirectory方法,對于每一個文件對象調用handleFile方法。

private void walk(File directory, int depth, Collection results) throws IOException
{
checkIfCancelled(directory, depth, results);

if (handleDirectory(directory, depth, results))
{
handleDirectoryStart(directory, depth, results);
int childDepth = depth + 1;

if (depthLimit < 0 || childDepth <= depthLimit)
{
checkIfCancelled(directory, depth, results);
File[] childFiles = (filter == null ? directory.listFiles() : directory.listFiles(filter));

if (childFiles == null)
{
handleRestricted(directory, childDepth, results);

} else
{

for (int i = 0; i < childFiles.length; i++)
{
File childFile = childFiles[i];

if (childFile.isDirectory())
{
walk(childFile, childDepth, results);

} else
{
checkIfCancelled(childFile, childDepth, results);
handleFile(childFile, childDepth, results);
checkIfCancelled(childFile, childDepth, results);
}
}
}
}
handleDirectoryEnd(directory, depth, results);
}
checkIfCancelled(directory, depth, results);
}
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2010-03-09 00:26
Paul Lin 閱讀(3531)
評論(1) 編輯 收藏 所屬分類:
J2SE