`

JAVA读取文件夹大小的几种方法实例

    博客分类:
  • java
阅读更多

总是发现自己的C盘快满了,清理程序也不会帮我自己清理,然后就自己写了一个程序去读取磁盘下的目录占多大空间,目前只能读取总的大小,正在整改看能不能把每个目录总的大小打印出来,这样就可以去删除了,否则自己挨个的去看,岂不是很傻,毕竟自己也是个屌丝程序员啊。

 

下面的都是从网上摘录下的,我拿的这几个都能跑,不能跑的,我就不贴出来了。

 

方法一:

package com.beijishiqidu.file;

import java.io.File;

public class _01_TotalFileSizeSequential {

    public static void main(String[] args) {

        final long start = System.nanoTime();

        String filePath = "C:\\Users\\Administrator";

        File file = new File(filePath);
        Long result = getTotalFileSize(file);

        final long end = System.nanoTime();

        System.out.println("总大小为(G):" + result / 1024d / 1024d / 1024d);

        System.out.println("_01_TotalFileSizeSequential  ----> Time taken(秒): " + (end - start) / 1.0e9);
    }

    private static long getTotalFileSize(File file) {

        if (file.isFile()) {
            return file.length();
        }

        File[] fileArray = file.listFiles();
        long total = 0;
        if (fileArray != null) {
            for (File tmpFile : fileArray) {
                total += getTotalFileSize(tmpFile);
            }
        }

        return total;
    }

}

运行结果: 

总大小为(G):8.57133452873677
_01_TotalFileSizeSequential  ----> Time taken(秒): 11.744519825

 

方法二:

package com.beijishiqidu.file;

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.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class _02_ConcurrentTotalFileSize {

    public static void main(String[] args) {

        final long start = System.nanoTime();

        String filePath = "C:\\Users\\Administrator";

        File file = new File(filePath);
        Long result = new _02_ConcurrentTotalFileSize().getTotalSizeOfFilesInDir(file);

        final long end = System.nanoTime();

        System.out.println("总大小为(G):" + result / 1024d / 1024d / 1024d);

        System.out.println("_02_ConcurrentTotalFileSize  ----> Time taken(秒): " + (end - start) / 1.0e9);
    }

    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) {
        final ExecutorService service = Executors.newFixedThreadPool(100);
        long total = 0;
        try {
            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;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            service.shutdown();
        }

        return total;
    }
}

运行结果:

总大小为(G):8.571664821356535
_02_ConcurrentTotalFileSize  ----> Time taken(秒): 7.665382601

方法三:

package com.beijishiqidu.file;

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 _04_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 void main(String[] args) throws Exception {

        final long start = System.nanoTime();

        String filePath = "C:\\Users\\Administrator";

        File file = new File(filePath);
        Long result = new _04_ConcurrentTotalFileSizeWLatch().getTotalSizeOfFile(file);

        final long end = System.nanoTime();

        System.out.println("总大小为(G):" + result / 1024d / 1024d / 1024d);

        System.out.println("_04_ConcurrentTotalFileSizeWLatch  ----> Time taken(秒): " + (end - start) / 1.0e9);

    }

    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 File file) throws InterruptedException {
        service = Executors.newFixedThreadPool(100);
        pendingFileVisits.incrementAndGet();
        try {
            updateTotalSizeOfFilesInDir(file);
            latch.await(100, TimeUnit.SECONDS);
            return totalSize.longValue();
        } finally {
            service.shutdown();
        }
    }
}

运行结果:

总大小为(G):8.572077584452927
_04_ConcurrentTotalFileSizeWLatch  ----> Time taken(秒): 7.384791101

方法四:

package com.beijishiqidu.file;

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 _05_ConcurrentTotalFileSizeWQueue {

    private ExecutorService service;
    final private BlockingQueue<Long> fileSizes = new ArrayBlockingQueue<Long>(500);
    final AtomicLong pendingFileVisits = new AtomicLong();

    public static void main(String[] args) throws Exception {

        final long start = System.nanoTime();

        String filePath = "C:\\Users\\Administrator";

        File file = new File(filePath);
        Long result = new _05_ConcurrentTotalFileSizeWQueue().getTotalSizeOfFile(file);

        final long end = System.nanoTime();

        System.out.println("总大小为(G):" + result / 1024d / 1024d / 1024d);

        System.out.println("_05_ConcurrentTotalFileSizeWQueue  ----> Time taken(秒): " + (end - start) / 1.0e9);
    }


    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 File file) throws InterruptedException {
        service = Executors.newFixedThreadPool(100);
        try {
            startExploreDir(file);
            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();
        }
    }


}

运行结果:

总大小为(G):8.572272757068276
_05_ConcurrentTotalFileSizeWQueue  ----> Time taken(秒): 7.623957758

方法五:

package com.beijishiqidu.file;

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 _06_FileSizeWForkJoinPool {

    public static void main(String[] args) {
        final long start = System.nanoTime();

        String filePath = "C:\\Users\\Administrator";

        File file = new File(filePath);
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        Long result = forkJoinPool.invoke(new FileSizeFinder(file));

        final long end = System.nanoTime();

        System.out.println("总大小为(G):" + result / 1024d / 1024d / 1024d);

        System.out.println("_06_FileSizeWForkJoinPool  ----> Time taken(秒): " + (end - start) / 1.0e9);
    }

    private static class FileSizeFinder extends RecursiveTask<Long> {

        private static final long serialVersionUID = 8030791942789701702L;

        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;
        }
    }

}

运行结果:

总大小为(G):8.572774960659444
_06_FileSizeWForkJoinPool  ----> Time taken(秒): 5.658299909

 

 

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类的成员 199 实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 ...

    Java之IO流学习总结

    ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形...

    springmybatis

    请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句: session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1) 其实还有更简单的方法,而且是更好的方法,使用合理描述参数和...

    asp.net知识库

    关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种...

    新版Android开发教程.rar

    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    8.9.4 PGA大小 224 8.10 组织行为 224 8.11 小结 224 第9章 Model子句 225 9.1 电子表格 225 9.2 通过Model子句进行跨行引用 226 9.2.1 示例数据 226 9.2.2 剖析Model子句 227 9.2.3 规则 228 9.3 位置和...

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;......

    IIS6.0 IIS,互联网信息服务

    以及引入了命令行工具 Appcmd.exe ,给 Web 服务器的日常管理、监视和配置提供了除图形接口外的另一种方式,更为简单、高效。 同Windows XP一样,在Windows Vista的默认设置下,IIS (Internet 信息服务) 7.0未予安装...

Global site tag (gtag.js) - Google Analytics