(一)单线程递归方式
创新互联建站专注于企业营销型网站、网站重做改版、横山网站定制设计、自适应品牌网站建设、html5、商城网站定制开发、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为横山等各大城市提供网站开发制作服务。
- 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
subDirectories; - public SubDirectoriesAndSize(final long totalSize,
- final List
theSubDirs) { - size = totalSize;
- subDirectories = Collections.unmodifiableList(theSubDirs);
- }
- }
- private SubDirectoriesAndSize getTotalAndSubDirs(final File file) {
- long total = 0;
- final List
subDirectories = new ArrayList (); - 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
directories = new ArrayList (); - directories.add(file);
- while (!directories.isEmpty()) {
- final List
> partialResults = new ArrayList >(); - for (final File directory : directories) {
- partialResults.add(service
- .submit(new Callable
() { - public SubDirectoriesAndSize call() {
- return getTotalAndSubDirs(directory);
- }
- }));
- }
- directories.clear();
- for (final Future
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
> partialTotalFutures = new ArrayList >(); - for (final File child : children) {
- partialTotalFutures.add(service.submit(new Callable
() { - public Long call() throws InterruptedException,
- ExecutionException, TimeoutException {
- return getTotalSizeOfFilesInDir(service, child);
- }
- }));
- }
- for (final Future
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);
- }
- }
#p#
(四)使用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
fileSizes = new ArrayBlockingQueue ( - 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
{ - 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
> tasks = new ArrayList >(); - for (final File child : children) {
- if (child.isFile()) {
- size += child.length();
- } else {
- tasks.add(new FileSizeFinder(child));
- }
- }
- for (final ForkJoinTask
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);
- }
- }
网站名称:Java读取文件夹大小的6种方法及代码
标题来源:http://www.36103.cn/qtweb/news31/30081.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联