更新時(shí)間:2022-09-15 來(lái)源:黑馬程序員 瀏覽量:
大家好,這篇文章為大家介紹一下怎樣遍歷電腦上的一個(gè)文件夾。
通常遍歷文件夾我們都是使用遞歸進(jìn)行操作,這種方式比較簡(jiǎn)單,也比較容易理解,本文的第一種實(shí)現(xiàn)也是使用遞歸。然后再為大家介紹另一種不使用遞歸的方式,只用到了循環(huán)和集合,這種方式由于沒(méi)有使用遞歸,所以效率更高一些!
整體思路:
public class Demo{ public static void main(String[] args){ //1).使用File封裝初始目錄 File dir = new File("d:\\多級(jí)目錄"); //調(diào)用遞歸方法 searchFile(dir); } //遞歸方法 public static void searchFile(File dir){ //2).打印這個(gè)目錄 System.out.println(dir.getAbsolutePath()); //3). 獲取這個(gè)目錄下所有的子文件和子目錄的數(shù)組。 File[] files = dir.listFiles(); //4). 遍歷這個(gè)數(shù)組,取出每個(gè)File對(duì)象 if(files != null){ for(File f : files){ //5).判斷這個(gè)File是否是一個(gè)文件,是: if(f.isFile()){ //打印 System.out.println(f); }else{//6).否則就是一個(gè)目錄,繼續(xù)遞歸 //遞歸 searchFile(f); } } } } }
這種實(shí)現(xiàn)方式的核心就是每個(gè)目錄都會(huì)調(diào)用searchFile()方法,而searchFile()方法針對(duì)每個(gè)目錄的工作都是一樣的:打印目錄、獲取目錄下所偶有的子文件和子目錄的數(shù)組、遍歷數(shù)組......從而形成了遞歸調(diào)用。
由于遞歸需要再次調(diào)用方法,導(dǎo)致方法入棧,從而降低程序的執(zhí)行效率!
不使用遞歸的思路
1). 取出,并刪除集合中的索引為0的"File對(duì)象"(此File對(duì)象可能是文件,也可能是目錄)
2). 打印這個(gè)File對(duì)象。
3). 判斷此File對(duì)象是否是"目錄",是:
獲取此目錄下所有子文件和子目錄的File數(shù)組,并添加到這個(gè)集合的前面
循環(huán)結(jié)束
這個(gè)流程用循環(huán)代替了遞歸,每次將目錄的File對(duì)象添加到集合,然后再取出,刪除。再獲取這個(gè)目錄下所有的子目錄和子文件的數(shù)組,并添加到集合,然后再循環(huán)。最終直至把所有文件都取出,并刪除,打印,集合為空,結(jié)束循環(huán)。
/** * 非遞歸遍歷目錄 * 創(chuàng)建一個(gè)List對(duì)象,把目錄放到List中 * 循環(huán)遍歷,每次取出第一個(gè)元素,如果是目錄就把目錄中的內(nèi)容放到List最前面,如果不是目錄只取出即可。 */ public class SearchDir { public static void main(String[] args) { File dir = new File("d:\\多級(jí)目錄"); searchDir(dir); } public static void searchDir(File dir) { //定義集合 List<File> list = new ArrayList<>(); //將參數(shù)dir對(duì)象添加到集合 list.add(dir); //循環(huán),條件:集合非空 while (!list.isEmpty()) { //取出,并刪除集合的第一個(gè)File對(duì)象 File file = list.remove(0); //打印這個(gè)File對(duì)象 System.out.println(file.getAbsoluteFile()); //如果此File對(duì)象是一個(gè)目錄 if(file.isDirectory()) { //獲取此File對(duì)象下所有子文件和子目錄的數(shù)組,并添加到集合的前面 list.addAll(0, Arrays.asList(file.listFiles())); } //繼續(xù)下一次循環(huán)...... } } }
這種方式僅僅用到了集合,沒(méi)有使用遞歸,所以占用系統(tǒng)資源較小,效率比較高!是不是很巧妙?大家學(xué)會(huì)了嗎?
Java培訓(xùn):不使用數(shù)組實(shí)現(xiàn)打印“楊輝三角形”
2022-09-15Java培訓(xùn):Java程序的基本格式
2022-09-14java編程入門(mén)先學(xué)什么?
2022-09-13計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)及應(yīng)用:綜合布線系統(tǒng)的特點(diǎn)
2022-09-09轉(zhuǎn)行學(xué)java,IT大佬給出了哪些壓箱底的招?
2022-09-07MySQL數(shù)據(jù)庫(kù)分頁(yè)查詢(xún)功能的實(shí)現(xiàn)
2022-09-06