一、為什麼需要遍歷目錄
在程序開發中,經常需要讀取指定路徑下的所有文件或者文件夾。而對於大規模的文件讀取任務,手動一個一個的去查找並讀取文件顯然是不可取的。
此時就需要一種方法可以自動遍歷指定目錄下的所有文件和文件夾,並返回一個包含目錄下所有文件絕對路徑的列表或集合。
二、Java中遍歷目錄的方法
Java中實現遍歷目錄的方法有多種,本文將講解三種常見的方法。
1. 遞歸算法
遞歸算法是一種常見的遍歷目錄的方式,其思路為:如果當前文件是文件夾,則遞歸該文件夾;反之,將文件路徑加入列表。具體實現代碼如下:
public static List getFiles(String path) { List fileList = new ArrayList(); File[] files = new File(path).listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { fileList.addAll(getFiles(file.getAbsolutePath())); } else { fileList.add(file.getAbsolutePath()); } } } return fileList; }
2. 廣度優先算法
廣度優先算法則是先將根目錄下的所有文件和文件夾壓入隊列,然後不斷從隊首取出文件夾並將其子文件夾和文件入隊,直到隊列為空。具體實現代碼如下:
public static List getFiles(String path) { List fileList = new ArrayList(); Queue queue = new LinkedList(); queue.offer(new File(path)); while (!queue.isEmpty()) { File t = queue.poll(); if (t.isDirectory()) { File[] files = t.listFiles(); if (files != null) { for (File file : files) { queue.offer(file); } } } else { fileList.add(t.getAbsolutePath()); } } return fileList; }
3. 深度優先算法
深度優先算法是一種藉助棧實現的遍歷方式,其基本思路是先將根目錄壓入棧中,然後取出棧頂的文件,如果是文件夾則將其子文件夾和文件倒序壓入棧中,直到棧為空為止。具體實現代碼如下:
public static List getFiles(String path) { List fileList = new ArrayList(); Stack stack = new Stack(); stack.push(new File(path)); while (!stack.empty()) { File t = stack.pop(); if (t.isDirectory()) { File[] files = t.listFiles(); if (files != null) { for (int i = files.length - 1; i >= 0; i--) { stack.push(files[i]); } } } else { fileList.add(t.getAbsolutePath()); } } return fileList; }
三、總結
對於小文件讀取任務,以上三種遍歷目錄的方法都可以應對;但對於文件數較多的情況,廣度優先算法和深度優先算法可能會遭遇棧內存溢出或隊列過大的問題,此時遞歸算法較為穩妥。
Java提供了多種實現遍歷目錄的方法,根據不同的需求可以靈活選擇對應的方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/249547.html