1. 程式人生 > >遞迴與非遞迴 遍歷檔案目錄

遞迴與非遞迴 遍歷檔案目錄

遞迴遍歷目錄的缺點:遇到多層級目錄時,層級越多,堆疊的負荷越大
import java.io.File;
import java.util.LinkedList;

/*
 * 採用非遞迴方式遍歷目錄及其子目錄的檔案  
 */
public class ProcessDirectory {
	public static int num;//檔案總量
	
	public static void main(String[] args) {
		String path = "/Users/stone/Downloads/temp";
//		scanDirNoRecursion(path);
		
		scanDirRecursion(new File(path));
		System.out.println(path + "目錄下共有檔案數量為:" + num);
	}
	
	// 非遞迴
	public static void scanDirNoRecursion(String path) {
		LinkedList list = new LinkedList();
		File file = new File(path);
		if (file.isFile()) {
			System.out.println(file.getAbsolutePath());
			num++;
			return;
		}
		list.add(file);//是目錄則新增進連結串列
		while (!list.isEmpty()) {//如果不為空
			File f = (File) list.removeFirst(); //先進先出 取出首個檔案目錄物件
			File[] listFiles = f.listFiles();
			if (listFiles == null) {
				return;
			}
			int len = listFiles.length;
			for (int i = 0; i < len; i++) {
				if (listFiles[i].isDirectory()) {
					list.add(listFiles[i]);
				} else {
					System.out.println(listFiles[i].getAbsolutePath());
					num++;
				}
			}
		}
		System.out.println(path + "目錄下共有檔案數量為:" + num);
	}
	
	//遞迴
	public static void scanDirRecursion(File file) {
		if (file.isFile()) {
			System.out.println(file.getAbsolutePath());
			num++;
			return;
		}
		File[] listFiles = file.listFiles();
		int len = listFiles.length;
		for (int i = 0; i < len; i++) {
			scanDirRecursion(listFiles[i]);
		}
	}
}