JAVA读取文件夹大小的几种方式

(一)单线程递归方式

package com.taobao.test;import java.io.File;public class TotalFileSizeSequential {public static String fileName = “C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk”;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;}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 {String fileName = “C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk”;class SubDirectoriesAndSize { 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();elsesubDirectories.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();}}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 多线程的另外一种实现

转动心中的期待,血在澎湃,吃苦流汗算什么。

JAVA读取文件夹大小的几种方式

相关文章:

你感兴趣的文章:

标签云: