zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

JAVA方法代码 读取 大小 文件夹
2023-09-27 14:23:41 时间
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 多线程实现



public class ConcurrentTotalFileSize {      public static final String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk";      class SubDirectoriesAndSize {          final public long 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();                      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 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();          }      }      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 多线程的另外一种实现



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 Future Long  partialTotalFutures = new ArrayList Future Long ();              for (final File child : children) {                  partialTotalFutures.add(service.submit(new Callable Long () {                      public Long call() throws InterruptedException,                              ExecutionException, TimeoutException {                          return getTotalSizeOfFilesInDir(service, child);                      }                  }));              }              for (final Future Long  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实现多线程下的并发控制



    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的实现



public class ConcurrentTotalFileSizeWQueue {      public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk";      private ExecutorService service;      final private BlockingQueue Long  fileSizes = new ArrayBlockingQueue Long (              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来实现



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 Long  {          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 ForkJoinTask Long  tasks = new ArrayList ForkJoinTask Long ();                      for (final File child : children) {                          if (child.isFile()) {                              size += child.length();                          } else {                              tasks.add(new FileSizeFinder(child));                          }                      }                      for (final ForkJoinTask Long  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为何总写出C风格的代码? “你看你所有代码都是把字段取出来计算,然后,再塞回去。各种不同层面的业务计算混在一起,将来有一点调整,所有代码都得跟着变。”
代码优雅之道——Java如何判空 实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。 针对异常的处理我们在上一篇有提及:
【Java】七大排序(详解 + 代码 + 变种) 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。平时的上下文中,如果提到排序,通常指的是排升序(非降序)。