栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

本文出自:http://developer.51cto.com/art/201503/468128_1.htm


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/233883.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号