1 import java.io.File; 2 import java.util.Arrays; 3 import java.util.Stack; 4 5 public class TestStack { 6 public static void main(String[] args) { 7 String path = "/mnt/dev/test"; 8 long start = System.currentTimeMillis(); 9 long[] result = loop(path); //循環方式 五次分別耗時 174 ms, 248 ms, 293 ms, 185 ms, 173 ms 10 // long[] result = recursion(path); //遞歸方式 五次分別耗時 197 ms, 226 ms, 207 ms, 212 ms, 294 ms 11 System.out.println(Arrays.toString(result)); 12 long end = System.currentTimeMillis(); 13 System.out.println("total time :" + (end - start) + " ms"); 14 } 15 16 /** 17 * 循環 獲取指定目錄下文件個數和文件大小 18 * 19 * @param path 20 * @return long[fileCount, dataSize(byte)] 21 */ 22 public static long[] loop(String path) { 23 File file = new File(path); 24 Stack<File> stack = new Stack<File>(); 25 stack.push(file); 26 long fileCount = 0; 27 long dataSize = 0; 28 while (!stack.isEmpty()) { 29 File child = stack.pop(); 30 if (child.isDirectory()) { 31 // 排除隱藏目錄 32 if (!child.isHidden() && !child.getName().startsWith(".")) { 33 for (File f : child.listFiles()) stack.push(f); 34 } 35 } else if (child.isFile()) { 36 // 排除隱藏文件 37 if (!child.isHidden() && !child.getName().startsWith(".")) { 38 fileCount += 1; 39 dataSize += child.length(); 40 } 41 } 42 } 43 return new long[]{fileCount, dataSize}; 44 } 45 46 /** 47 * 遞歸 獲取指定目錄下文件個數和文件大小 48 * 49 * @param path 50 * @return long[fileCount, dataSize(byte)] byte 51 */ 52 public static long[] recursion(String path) { 53 File files = new File(path); 54 if (files.isFile()) { 55 // 排除隱藏文件或目錄 56 if (!files.isHidden() && !files.getName().startsWith(".")) { 57 return new long[]{1, files.length()}; 58 } else { 59 return new long[]{0, 0}; 60 } 61 } 62 long[] result = new long[]{0, 0}; 63 for (File file : files.listFiles()) { 64 if (!file.isHidden() && !file.getName().startsWith(".")) { 65 long[] longs = file.isDirectory() ? recursion(file.getAbsolutePath()) : new long[]{1, file.length()}; 66 result[0] += longs[0]; 67 result[1] += longs[1]; 68 } 69 } 70 return result; 71 } 72 }