遞迴與非遞迴 遍歷檔案目錄
阿新 • • 發佈:2019-02-03
遞迴遍歷目錄的缺點:遇到多層級目錄時,層級越多,堆疊的負荷越大
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]); } } }