Java读取文件夹大小的6种方法及代码

更新时间:2016-10-31 15:09:21 点击次数:1769次

这篇文章介绍了JAVA读取文件夹大小的几种方法实例,有需要的朋友可以参考一下。

(一)单线程递归方式

package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; // 递归方式 计算文件的大小 private long getTotalSizeOfFilesInDir(final File file) { if (file.isFile()) return file.length(); final File[] children = file.listFiles(); long total = 0; if (children != null) for (final File child : children)
                total += getTotalSizeOfFilesInDir(child); return total;
    } public static void main(final String[] args) { final long start = System.nanoTime(); final long total = new TotalFileSizeSequential()
                .getTotalSizeOfFilesInDir(new File(fileName)); final long end = System.nanoTime();
        System.out.println("Total Size: " + total);
        System.out.println("Time taken: " + (end - start) / 1.0e9);
    }
}

(二)使用Executors.newFixedThreadPool和callable 多线程实现

package com.taobao.test; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class ConcurrentTotalFileSize { public static final String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk";
    class SubDirectoriesAndSize { final public long size; final public List<File> subDirectories; public SubDirectoriesAndSize(final long totalSize, final List<File> theSubDirs) {
            size = totalSize;
            subDirectories = Collections.unmodifiableList(theSubDirs);
        }
    } private SubDirectoriesAndSize getTotalAndSubDirs(final File file) { long total = 0; final List<File> subDirectories = new ArrayList<File>(); if (file.isDirectory()) { final File[] children = file.listFiles(); if (children != null) for (final File child : children) { if (child.isFile())
                        total += child.length(); else subDirectories.add(child);
                }
        } return new SubDirectoriesAndSize(total, subDirectories);
    } private long getTotalSizeOfFilesInDir(final File file) throws InterruptedException, ExecutionException, TimeoutException { final ExecutorService service = Executors.newFixedThreadPool(100); try { long total = 0; final List<File> directories = new ArrayList<File>();
            directories.add(file); while (!directories.isEmpty()) { final List<Future<SubDirectoriesAndSize>> partialResults = new ArrayList<Future<SubDirectoriesAndSize>>(); for (final File directory : directories) {
                    partialResults.add(service
                            .submit(new Callable<SubDirectoriesAndSize>() { public SubDirectoriesAndSize call() { return getTotalAndSubDirs(directory);
                                }
                            }));
                }
                directories.clear(); for (final Future<SubDirectoriesAndSize> partialResultFuture : partialResults) { final SubDirectoriesAndSize subDirectoriesAndSize = partialResultFuture
                            .get(100, TimeUnit.SECONDS);
                    directories.addAll(subDirectoriesAndSize.subDirectories);
                    total += subDirectoriesAndSize.size;
                }
            } return total;
        } finally {
            service.shutdown();
        }
    } public static void main(final String[] args) throws InterruptedException,
            ExecutionException, TimeoutException { final long start = System.nanoTime(); final long total = new ConcurrentTotalFileSize()
                .getTotalSizeOfFilesInDir(new File(fileName)); final long end = System.nanoTime();
        System.out.println("Total Size: " + total);
        System.out.println("Time taken: " + (end - start) / 1.0e9);
    }
}

(三)使用Executors.newFixedThreadPool和callable 多线程的另外一种实现

package com.taobao.test; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class NaivelyConcurrentTotalFileSize { public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private long getTotalSizeOfFilesInDir(final ExecutorService service, final File file) throws InterruptedException, ExecutionException,
            TimeoutException { if (file.isFile()) return file.length(); long total = 0; final File[] children = file.listFiles(); if (children != null) { final List<Future<Long>> partialTotalFutures = new ArrayList<Future<Long>>(); for (final File child : children) {
                partialTotalFutures.add(service.submit(new Callable<Long>() { public Long call() throws InterruptedException,
                            ExecutionException, TimeoutException { return getTotalSizeOfFilesInDir(service, child);
                    }
                }));
            } for (final Future<Long> partialTotalFuture : partialTotalFutures)
                total += partialTotalFuture.get(100, TimeUnit.SECONDS);
        } return total;
    } private long getTotalSizeOfFile(final String fileName) throws InterruptedException, ExecutionException, TimeoutException { final ExecutorService service = Executors.newFixedThreadPool(100); try { return getTotalSizeOfFilesInDir(service, new File(fileName));
        } finally {
            service.shutdown();
        }
    } public static void main(final String[] args) throws InterruptedException,
            ExecutionException, TimeoutException { final long start = System.nanoTime(); final long total = new NaivelyConcurrentTotalFileSize()
                .getTotalSizeOfFile(fileName); final long end = System.nanoTime();
        System.out.println("Total Size: " + total);
        System.out.println("Time taken: " + (end - start) / 1.0e9);
    }
}

(四)使用CountDownLatch和AtomicLong实现多线程下的并发控制

package com.taobao.test; import java.io.File; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; public class ConcurrentTotalFileSizeWLatch { private ExecutorService service; final private AtomicLong pendingFileVisits = new AtomicLong(); final private AtomicLong totalSize = new AtomicLong(); final private CountDownLatch latch = new CountDownLatch(1); public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private void updateTotalSizeOfFilesInDir(final File file) { long fileSize = 0; if (file.isFile())
            fileSize = file.length(); else { final File[] children = file.listFiles(); if (children != null) { for (final File child : children) { if (child.isFile())
                        fileSize += child.length(); else {
                        pendingFileVisits.incrementAndGet();
                        service.execute(new Runnable() { public void run() {
                                updateTotalSizeOfFilesInDir(child);
                            }
                        });
                    }
                }
            }
        }
        totalSize.addAndGet(fileSize); if (pendingFileVisits.decrementAndGet() == 0)
            latch.countDown();
    } private long getTotalSizeOfFile(final String fileName) throws InterruptedException {
        service = Executors.newFixedThreadPool(100);
        pendingFileVisits.incrementAndGet(); try {
            updateTotalSizeOfFilesInDir(new File(fileName));
            latch.await(100, TimeUnit.SECONDS); return totalSize.longValue();
        } finally {
            service.shutdown();
        }
    } public static void main(final String[] args) throws InterruptedException { final long start = System.nanoTime(); final long total = new ConcurrentTotalFileSizeWLatch()
                .getTotalSizeOfFile(fileName); final long end = System.nanoTime();
        System.out.println("Total Size: " + total);
        System.out.println("Time taken: " + (end - start) / 1.0e9);
    }
}

(五)使用BlockingQueue和AtomicLong的实现

package com.taobao.test; import java.io.File; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; public class ConcurrentTotalFileSizeWQueue { public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private ExecutorService service; final private BlockingQueue<Long> fileSizes = new ArrayBlockingQueue<Long>( 500); final AtomicLong pendingFileVisits = new AtomicLong(); private void startExploreDir(final File file) {
        pendingFileVisits.incrementAndGet();
        service.execute(new Runnable() { public void run() {
                exploreDir(file);
            }
        });
    } private void exploreDir(final File file) { long fileSize = 0; if (file.isFile())
            fileSize = file.length(); else { final File[] children = file.listFiles(); if (children != null) for (final File child : children) { if (child.isFile())
                        fileSize += child.length(); else {
                        startExploreDir(child);
                    }
                }
        } try {
            fileSizes.put(fileSize);
        } catch (Exception ex) { throw new RuntimeException(ex);
        }
        pendingFileVisits.decrementAndGet();
    } private long getTotalSizeOfFile(final String fileName) throws InterruptedException {
        service = Executors.newFixedThreadPool(100); try {
            startExploreDir(new File(fileName)); long totalSize = 0; while (pendingFileVisits.get() > 0 || fileSizes.size() > 0) { final Long size = fileSizes.poll(10, TimeUnit.SECONDS);
                totalSize += size;
            } return totalSize;
        } finally {
            service.shutdown();
        }
    } public static void main(final String[] args) throws InterruptedException { final long start = System.nanoTime(); final long total = new ConcurrentTotalFileSizeWQueue()
                .getTotalSizeOfFile(fileName); final long end = System.nanoTime();
        System.out.println("Total Size: " + total);
        System.out.println("Time taken: " + (end - start) / 1.0e9);
    }
}

(六)使用jdk7的ForkJoin来实现

package com.taobao.test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask; public class FileSize { private final static ForkJoinPool forkJoinPool = new ForkJoinPool(); public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private static class FileSizeFinder extends RecursiveTask<Long> { final File file; public FileSizeFinder(final File theFile) {
            file = theFile;
        }
        @Override public Long compute() { long size = 0; if (file.isFile()) {
                size = file.length();
            } else { final File[] children = file.listFiles(); if (children != null) {
                    List<ForkJoinTask<Long>> tasks = new ArrayList<ForkJoinTask<Long>>(); for (final File child : children) { if (child.isFile()) {
                            size += child.length();
                        } else {
                            tasks.add(new FileSizeFinder(child));
                        }
                    } for (final ForkJoinTask<Long> task : invokeAll(tasks)) {
                        size += task.join();
                    }
                }
            } return size;
        }
    } public static void main(final String[] args) { final long start = System.nanoTime(); final long total = forkJoinPool.invoke(new FileSizeFinder(new File("/home"))); final long end = System.nanoTime();
        System.out.println("Total Size: " + total);
        System.out.println("Time taken: " + (end - start) / 1.0e9);
    }
}

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!