博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java读取文件夹大小的6种方法及代码
阅读量:4291 次
发布时间:2019-05-27

本文共 13005 字,大约阅读时间需要 43 分钟。

学习Java的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:279558494 我们一起学Java!

这篇文章介绍了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
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); }}

(四)使用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的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:279558494 我们一起学Java!

转载地址:http://lnggi.baihongyu.com/

你可能感兴趣的文章
Android Studio里面配置Tesseract
查看>>
深入浅出JavaScript之this
查看>>
Android include标签的使用注意事项
查看>>
final成员变量和final局部变量
查看>>
Android数据加密之异或加密算法
查看>>
greenDao好的示例网址
查看>>
Android自定义控件--仿安全卫士中的一键加速
查看>>
Android Tools Attributes,让布局设计所见即所得
查看>>
Android内存泄露的原因
查看>>
Java并发总结
查看>>
JavaScript筑基篇(二)->JavaScript数据类型
查看>>
干货:Java几种线程池的分析和使用。
查看>>
避免在Java接口中使用数组的3个理由
查看>>
android 自定义带动画的统计饼图
查看>>
入职必备,Android 真实面试题(内有答案)
查看>>
JavaScript 日期处理类库---Moment.js
查看>>
仿斗鱼直播的弹幕效果实现
查看>>
Android(Java)中的Object
查看>>
Java反射机制——学习总结
查看>>
Android大图片处理
查看>>