当前位置: 首页 > 科技观察

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

时间:2023-03-18 23:07:44 科技观察

(1)单线程递归方式packagecom.taobao.test;importjava.io.File;publicclassTotalFileSizeSequential{publicstaticStringfileName="C:\\DocumentsandSettings\\Administrator\\desktop\\monkeytalk";//递归方式计算大小文件privatelonggetTotalSizeOfFilesInDir(finalFilefile){if(file.isFile())returnfile.length();finalFile[]children=file.listFiles();longtotal=0;if(children!=null)for(finalFilechild:children)total+=getTotalSizeOfFilesInDir(child);returntotal;}publicstaticvoidmain(finalString[]args){finallongstart=System.nanoTime();finallongtotal=newTotalFileSizeSequential().getTotalSizeOfFilesInDir(newFile(fileName));finallongend=System.nanoTime();系统。out.println("TotalSize:"+total);System.out.println("Timetaken:"+(end-start)/1.0e9);}}(2)利用Executors.newFixedThreadPool和可调用多线程实现packagecom.taobao.test;导入java。io.File;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;publicclassConcurrentTotalFileSize{publicstaticfinalStringfileName="C":\\DocumentsandSettings\\Administrator\\桌面\\monkeytalk";classSubDirectoriesAndSize{finalpubliclongsize;finalpublicListsubDirectories;publicSubDirectoriesAndSize(finallongtotalSize,finalListtheSubDirs){size=totalSize;subDirectories=Collections.unmodifiableList(theSubDirs);}}privateSubDirectoriesAndSizegetTotalAndSubDirs(finalFilefile){longtotal=0;finalListsubDirectories=newArrayList();if(file.isDirectory()){finalFile[]children=file.listFiles();if(children!=null)for(finalFilechild:children){if(child.isFile())total+=child.length();elsesubDirectories.add(child);}}returnnewSubDirectoriesAndSize(total,subDirectories);}privatelonggetTotalSizeOfFilesInDir(finalFilefile)throwsInterruptedException,ExecutionException,TimeoutException{finalExecutorServiceservice=Executors.newFixedThreadPool(100);try{longtotal=0;finalListdirectories=newArrayList();directories.add(file);while(!directories.isEmpty()){finalList>partialResults=newArrayList>();for(finalFiledirectory:directories){partialResults.add(service.submit(newCallable(){publicSubDirectoriesAndSizecall(){returngetTotalAndSubDirs(目录);}}));}directories.clear();for(finalFuturepartialResultFuture:partialResults){finalSubDirectoriesAndSizesubDirectoriesAndSize=partialResultFuture.get(100,TimeUnit.SECONDS);directories.addAll(subDirectoriesAndSize.subDirectories);total+=subDirectoriesAndSize.size;}}returntotal;}finally{service.shutdown();}}publicstaticvoidmain(finalString[]args)throwsInterruptedException,ExecutionException,TimeoutException{finallongstart=System.nanoTime();finallongtotal=newConcurrentTotalFileSize().getTotalSizeOfFilesInDir(newFile(fileName));finallongend=System.nanoTime();System.out.println("TotalSize:"+total);System.out.println("Timetaken:"+(end-start)/1.0e9);}}(三)使用Executors.newFixedThreadPool和callable多线程的另一种实现packagecom.taobao.测试;importjava.io.File;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent。执行者;importjava.util.concurrent.Future;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;publicclassNaivelyConcurrentTotalFileSize{publicstaticStringfileName="C:\\DocumentsandSettings\\Administrator\\桌面\\monkeytalk";privatelonggetTotalSizeOfFilesInDir(finalExecutorServiceservice,finalFilefile)throwsInterruptedException,ExecutionException,TimeoutException{if(file.isFile())returnfile.length();longtotal=0;finalFile[]children=file.listFiles();if(children!=null){finalList>partialTotalFutures=newArrayList>();for(finalFilechild:children){partialTotalFutures.add(service.submit(newCallable(){publicLongcall()throwsInterruptedException,ExecutionException,TimeoutException{returngetTotalSizeOfFilesInDir(服务,child);}}));}for(finalFuturepartialTotalFuture:partialTotalFutures)total+=partialTotalFuture.get(100,TimeUnit.SECONDS);}returntotal;}privatelonggetTotalSizeOfFile(finalStringfileName)throwsInterruptedException,ExecutionException,TimeoutException{finalExecutorServiceservice=执行器.newFixedThreadPool(100);try{returngetTotalSizeOfFilesInDir(service,newFile(fileName));}finally{service.shutdown();}}publicstaticvoidmain(finalString[]args)throwsInterruptedException,ExecutionException,TimeoutException{finallongstart=System.nanoTime();finallongtotal=newNaivelyConcurrentTotalFileSize().getTotalSizeOfFile(fileName);finallongend=System.nanoTime();System.out.println("TotalSize:"+total);System.out.println("Timetaken:"+(end-start)/1.0e9);}}#p#(四)使用CountDownLatch和AtomicLong实现多线程序下的并发控制packagecom.taobao.test;importjava.io.File;importjava...;finalprivateAtomicLongtotalSize=newAtomicLong();finalprivateCountDownLatchlatch=newCountDownLatch(1);publicstaticStringfileName="C:\\DocumentsandSettings\\Administrator\\桌面\\monkeytalk";privatevoidupdateTotalSizeOfFilesInDir(finalFilefile){longfileSize=0;if(file.isFile())fileSize=file.length();else{finalFile[]children=file.listFiles();if(children!=null){for(finalFilechild:儿童){if(child.isFile())fileSize+=child.length();else{pendingFileVisits.incrementAndGet();service.execute(newRunnable(){publicvoidrun(){updateTotalSizeOfFilesInDir(child);}});}}}}totalSize.addAndGet(fileSize);if(pendingFileVisits.decrementAndGet()==0)latch.countDown();}privatelonggetTotalSizeOfFile(finalStringfileName)throwsInterruptedException{service=Executors.newFixedThreadPool(100);pendingFileVisits.incrementAndGet();try{updateTotalSizeOfFilesInDir(newFile(fileName));latch.await(100,TimeUnit.SECONDS);returntotalSize.longValue();}finally{service.shutdown();}}publicstaticvoidmain(finalString[]args)throwsInterruptedException{finallongstart=System.nanoTime();finallongtotal=newConcurrentTotalFileSizeWLatch().getTotalSizeOfFile(文件名);finallongend=System.nanoTime();System.out.println("TotalSize:"+total);System.out.println("Timetaken:"+(end-start)/1.0e9);}}(五)使用BlockingQueue和AtomicLong的实现packagecom.taobao.test;importjava.io.File;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.atomic.AtomicLong;publicclassConcurrentTotalFileSizeWQueue{publicstaticStringfileName="C:\\DocumentsandSettings\\Administrator\\桌面\\monkeytalk";privateExecutorServiceservice;finalprivateBlockingQueuefileSizes=newArrayBlockingQueue(500);finalAtomicLongpendingFileVisits=newAtomicLongpendingFilelofinalFilelo();privateDrevoid().incrementAndGet();service.execute(newRunnable(){publicvoidrun(){exploreDir(file);}});}privatevoidexploreDir(finalFilefile){longfileSize=0;if(file.isFile())fileSize=file.length();else{finalFile[]children=file.listFiles();if(children!=null)for(finalFilechild:children){if(child.isFile())fileSize+=child.length();else{startExploreDir(child);}}}try{fileSizes.put(fileSize);}catch(Exceptionex){thrownewRuntimeException(ex);}pendingFileVisits.decrementAndGet();}privatelonggetTotalSizeOfFile(finalStringfileName)throwsInterruptedException{service=Executors.newFixedThreadPool(100);try{startExploreDir(newFile(fileName));longtotalSize=0;while(pendingFileVisits.get()>0||fileSizes.size()>0){finalLongsize=fileSizes.poll(10,TimeUnit.SECONDS);totalSize+=size;}returntotalSize;}最后{service.shutdown();}}publicstaticvoidmain(finalString[]args)throwsInterruptedException{finallongstart=System.nanoTime();finallongtotal=newConcurrentTotalFileSizeWQueue().getTotalSizeOfFile(fileName);finallongend=System.nanoTime();System.out.println("TotalSize:"+total);System.out.println("Timetaken:"+(end-start)/1.0e9);}}(六)使用jdk7的ForkJoin来实现packagecom.taobao.test;importjava.io.File;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ForkJoinPool;importjava.util.concurrent.ForkJoinTask;importjava.util.concurrent.RecursiveTask;publicclassFileSize{privatefinalstaticForkJoinPoolforkJoinPool=newForkJoinPool();publicstaticStringfileName="C:\\DocumentsandSettings\\Administrator\\桌面\\monkeytalk";privatestaticclassFileSizeFinderextendsRecursiveTask{finalFilefile;publicFileSizeFinder(finalFiletheFile){file=theFile;}@OverridepublicLong=compute(){longsize();if(file.isFile()){size=file.length();}else{finalFile[]children=file.listFiles();if(children!=null){List>tasks=newArrayList>();for(finalFilechild:children){if(child.isFile()){size+=child.length();}else{tasks.add(newFileSizeFinder(child));}}for(finalForkJoinTasktask:invokeAll(tasks)){size+=task.join();}}}returnssize;}}publicstaticvoidmain(finalString[]args){finallongstart=System.nanoTime();finallongtotal=forkJoinPool.invoke(newFileSizeFinder(newFile("/home")));finallongend=System.nanoTime();System.out.println("TotalSize:"+total);System.out.println("耗时:"+(end-start)/1.0e9);}}