Java递归和非递归遍历目录


原文:https://blog.csdn.net/earbao/article/details/25982133


  1. package cn.yws.getfilepath;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.LinkedList;  
  6. import java.util.List;  
  7. /** 
  8.  * Java递归和非递归遍历目录 
  9.  * @author Administrator 
  10.  * 
  11.  */  
  12. public class FileSystem {  
  13.   
  14.     public static void main(String[] args) {  
  15.   
  16.         long a = System.currentTimeMillis();  
  17.         List<File> resultfiles = new ArrayList<File>();  
  18.   
  19.         String[] lists = { "D:\\android\\androidNDK" };  
  20.         /* 
  21.         for (int i = 0; i < lists.length; i++) { 
  22.             File file = new File(lists[i]); 
  23.             scanDirRecursion(file, resultfiles, "java"); 
  24.         } 
  25.         for (File file : resultfiles) { 
  26.             System.out.println(file.getAbsolutePath()); 
  27.         }*/  
  28.           
  29.         for (int i = 0; i < lists.length; i++) {  
  30.             File file = new File(lists[i]);  
  31.             scanDirNoRecursion(file, resultfiles, "java");  
  32.         }  
  33.         for (File file : resultfiles) {  
  34.             System.out.println(file.getAbsolutePath());  
  35.         }  
  36.   
  37.         System.out.print("文件总数:" + resultfiles.size());  
  38.         System.out.print("总耗时:");  
  39.         System.out.println((System.currentTimeMillis() - a) + "ms");  
  40.         System.out.println((System.currentTimeMillis() - a) / 1000 + "s");  
  41.     }  
  42.   
  43.     /** 
  44.      * 非递归遍历目录 
  45.      *  
  46.      * @param file 
  47.      *            文件目录 
  48.      * @param resultfiles 
  49.      *            保存返回的结果集 
  50.      * @param endWith 
  51.      *            为null,则返回所有文件,不为空,则返回所匹配的文件 
  52.      */  
  53.     public static void scanDirNoRecursion(File dir, List<File> resultfiles,  
  54.             String endWith) {  
  55.         LinkedList<File> list = new LinkedList<File>();  
  56.         File file[] = dir.listFiles();  
  57.         for (int i = 0; i < file.length; i++) {  
  58.             if (file[i].isDirectory())  
  59.                 list.add(file[i]);  
  60.             else {  
  61.                 // System.out.println(file[i].getAbsolutePath());  
  62.                 if (file[i].getName().toLowerCase().endsWith(endWith.toLowerCase())) {  
  63.                     resultfiles.add(file[i]);  
  64.                 }  
  65.             }  
  66.         }  
  67.         File tmp;  
  68.         while (!list.isEmpty()) {  
  69.             tmp = list.removeFirst();// 首个目录  
  70.             if (tmp.isDirectory()) {  
  71.                 file = tmp.listFiles();  
  72.                 if (file == null)  
  73.                     continue;  
  74.                 for (int i = 0; i < file.length; i++) {  
  75.                     if (file[i].isDirectory())  
  76.                         list.add(file[i]);// 目录则加入目录列表,关键  
  77.                     else {  
  78.                         // System.out.println(file[i]);  
  79.                         if (endWith != null) {  
  80.                             if (file[i].getName().toLowerCase().endsWith(endWith.toLowerCase()))  
  81.                                 resultfiles.add(file[i]);  
  82.                         } else {  
  83.                             resultfiles.add(file[i]);  
  84.                         }  
  85.                     }  
  86.                 }  
  87.             } else {  
  88.                 // System.out.println(tmp);  
  89.                 if (endWith != null) {  
  90.                     if (tmp.getName().toLowerCase().endsWith(endWith.toLowerCase()))  
  91.                         resultfiles.add(tmp);  
  92.                 } else {  
  93.                     resultfiles.add(tmp);  
  94.                 }  
  95.             }  
  96.         }  
  97.     }  
  98.   
  99.     /** 
  100.      * 递归遍历目录 
  101.      *  
  102.      * @param file 
  103.      *            文件目录 
  104.      * @param resultfiles 
  105.      *            保存返回的结果集 
  106.      * @param endWith 
  107.      *            为null,则返回所有文件,不为空,则返回所匹配的文件 
  108.      */  
  109.     public static void scanDirRecursion(File file, List<File> resultfiles,  
  110.             String endWith) {  
  111.         try {  
  112.             if (file.canRead()) {  
  113.                 if (file.isDirectory()) {  
  114.                     String[] files = file.list();  
  115.                     if (files != null) {  
  116.                         for (int i = 0; i < files.length; i++) {  
  117.                             scanDirRecursion(new File(file, files[i]),  
  118.                                     resultfiles, endWith);  
  119.                         }  
  120.                     }  
  121.                 } else {  
  122.                     // System.out.println(file);  
  123.                     if (endWith != null) {  
  124.                         if (file.getName().toLowerCase().endsWith(endWith.toLowerCase()))  
  125.                             resultfiles.add(file);  
  126.                     } else {  
  127.                         resultfiles.add(file);  
  128.                     }  
  129.                 }  
  130.             }  
  131.         } catch (Exception e) {  
  132.             e.printStackTrace();  
  133.         }  
  134.     }  
  135.   
  136. }

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页