广度优先(以获取文件夹中所有文件为例)
第一步,创建队列,元素操作规则为:队列尾部加入元素,头部移除元素
第二步,把文件夹加入该队列
第三步,从该队列头移除文件夹,同时依次遍历它的所有孩子,如果孩子是文件,则提取;
如果孩子是文件夹,则加入队列尾部
第四步,重复第三步;直到队列为空为止。到此文件夹中所有文件都被获取
//获取文件夹下所有文件
public List<File> getFolderFiles(String folderName){
File folder = new File(folderName);
//保存结果
List<File> list = new ArrayList<>();
//记录当前要遍历的文件夹,广度优先遍历
LinkedList<File> currentFolders = new LinkedList<>();
//把要遍历的文件夹加入队列
currentFolders.addLast(folder);
while (!currentFolders.isEmpty()){
//从队列头拿出待遍历文件夹,如果其孩子是文件夹则加入队列尾部
File f = currentFolders.removeFirst();
File[] files = f.listFiles();
if (files != null && files.length > 0){
for (File file : files) {
if (file.isDirectory()){
currentFolders.addLast(file);
}else {
list.add(file);
}
}
}
}
return list;
}
深度优先(以删除文件夹folder0为例)
第一步,创建栈
第二步,文件夹folder(0)入栈
第三步,peek方式遍历栈顶文件夹,即只读数据,不出栈,如果第一个遍历到的孩子是文件,则直接删除,然后继续遍历;如果第一个遍历到的孩子是文件夹folder(1),则先暂停遍历folder(0),同时把folder(1)入栈,此时,栈中有两个元素,栈顶为folder(1),栈底为folder(0)
第四步,重复第三步,直到folder(N)为空,此时,删除folder(N),同时folderN出栈,此时,栈顶元素为folder(N-1),由于删除folder(N)时,暂停了folder(N-1)的遍历,那么现在folder(N)处理完成了,就继续folder(N-1)的遍历……直到处理完folder(N-1)的所有孩子,folder(N-1)为空,删除folder(N-1),同时folder(N-1)出栈
第五步,执行完以上所有步骤,就处理完了folder(0)所有的孩子,folder(0)为空,删除folder(0),folder(0)出栈,到此删除文件夹folder(0)完成
//深度优先遍历删除文件夹
public void deleteFolder(File folder){
//创建堆栈,记录当前要删除的文件夹
Stack<File> deleteStack = new Stack<>();
//将要删除的目标先入栈记录起来
deleteStack.push(folder);
//只要堆栈非空,深度优先遍历就没有结束
while (!deleteStack.isEmpty()){
//peek表示读取栈顶元素,不将该元素移除栈顶
File[] files = deleteStack.peek().listFiles();
if (files !=null && files.length > 0){
for (File file : files) {
if (file.isDirectory()){
deleteStack.push(file);
}else {
file.delete();
}
}
}
//检测栈顶元素是否为空,为空则表示该文件夹中的孩子已经全部删除
File[] temp = deleteStack.peek().listFiles();
if (temp == null && temp.length == 0){
//把该文件夹移除栈顶,并删除该文件夹
deleteStack.pop().delete();
}
}
}