关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java读取文件夹大小的6种方法及代码

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

    2015-03-12 00:00:00 出处:jaune161的专栏
    分享

    这篇文章介绍了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<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 多线程的另外一种实现

    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<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实现多线程下的并发控制

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

    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<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);
        }
    }
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。