非遞歸方式
public static void noRecursion(File dir){ int fileNum=0,folderNum=0; LinkedList<File> list=new LinkedList<File>(); if(dir.exists()){ if (null==dir.listFiles()){ return; } list.addAll(Arrays.asList(dir.listFiles())); while(!list.isEmpty()){ File[] files = list.removeFirst().listFiles(); if(null==files){ continue; } for (File f:files) { if (f.isDirectory()) { System.out.println("文件夾:" + f.getAbsolutePath()); list.add(f); folderNum++; } else { System.out.println("文件:" + f.getAbsolutePath()); fileNum++; } } } }else{ System.out.println("文件不存在!"); } System.out.println("文件夾數量:" + folderNum + ",文件數量:" + fileNum); }
遞歸方式
public static void showDir(File dir) { if(dir.exists()){ //抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件和目錄。 File[] files = dir.listFiles(); if(null!=files){ for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { showDir(files[i]); } else { System.out.println(files[i]); } } } }else{ System.out.println("文件不存在!"); } }
性能比較
public static void main(String[] args) { System.out.println("------------------------------------------遞歸開始--------------------------------------------------------"); long start = System.currentTimeMillis(); showDir(new File("D:\\IDEAProject\\helloMi")); long end = System.currentTimeMillis(); long num1=end-start; System.out.println("---------------------遞歸結束-----------------------"); System.out.println("-------------------- 非遞歸開始----------------------"); start=System.currentTimeMillis(); noRecursion(new File("D:\\IDEAProject\\helloMi")); end=System.currentTimeMillis(); System.out.println("---------------------非遞歸結束----------------------"); long num2=end-start; System.out.println("-------------------------遞歸用時:"+num1); System.out.println("-------------------------非遞歸用時:"+num2); } 結果: -------------------------遞歸用時:18 -------------------------非遞歸用時:20
