亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JAVA讀取文件夾大小的幾種方法實例

2019-11-26 15:56:26
字體:
來源:轉載
供稿:網友

(一)單線程遞歸方式

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产欧美亚洲国产日韩mv天天看完整| 久热精品视频在线免费观看| 91精品国产高清久久久久久| 久久久精品国产网站| 国产精品一区二区在线| 日本亚洲欧洲色α| 68精品国产免费久久久久久婷婷| 97香蕉久久超级碰碰高清版| 久久91亚洲精品中文字幕奶水| 欧美性xxxx极品hd满灌| 精品国产一区二区三区久久久狼| 欧美在线视频网站| 久久免费国产视频| 美日韩精品免费观看视频| 亚洲色图美腿丝袜| 欧美乱大交做爰xxxⅹ性3| 国产精品视频内| 日韩国产精品亚洲а∨天堂免| 日韩视频免费在线观看| 精品福利一区二区| 欧美精品在线播放| 日韩一二三在线视频播| 8x拔播拔播x8国产精品| 亚洲女性裸体视频| 亚洲男人7777| 日韩av男人的天堂| 亚洲精品美女久久久久| 91精品视频免费看| 国产一区二区成人| 欧美综合一区第一页| 欧美尺度大的性做爰视频| 久久在线精品视频| 日韩欧美成人精品| 亚洲人成电影在线| 亚洲专区国产精品| 亚洲欧美制服综合另类| 精品自在线视频| 最新国产精品拍自在线播放| 最新亚洲国产精品| 上原亚衣av一区二区三区| 中文字幕在线看视频国产欧美在线看完整| 九色精品美女在线| 亚洲国产另类久久精品| 亚洲精品视频中文字幕| 日韩欧美aaa| 日韩欧美精品网址| 亚洲最大av网| 欧美成人精品在线| 欧美精品一区二区免费| 欧美自拍大量在线观看| 欧美日韩精品二区| 日韩网站在线观看| 成人性生交大片免费观看嘿嘿视频| 亚洲色图综合久久| 8x拔播拔播x8国产精品| 精品精品国产国产自在线| 午夜精品久久久久久久白皮肤| 久久手机精品视频| 国产精品久久久久久搜索| 亚洲欧洲日产国码av系列天堂| 亚洲激情在线观看视频免费| 亚洲一区二区在线| 国产精品久久久久久久久借妻| 欧美日韩亚洲激情| 欧美黑人国产人伦爽爽爽| 91视频免费在线| 日韩中文第一页| 午夜精品久久久久久久99热浪潮| 国产欧美最新羞羞视频在线观看| 国产盗摄xxxx视频xxx69| 国产午夜精品免费一区二区三区| 中文字幕一区日韩电影| 欧美一级大胆视频| 国产精品久久久久久久久借妻| 亚洲人成电影在线播放| 欧美极品少妇xxxxⅹ裸体艺术| 久久人人爽国产| 国产精品日韩电影| 欧美性黄网官网| 8090理伦午夜在线电影| 欧美性色19p| 九九精品视频在线观看| 亚洲色图在线观看| 青青草一区二区| 26uuu另类亚洲欧美日本一| 日韩中文字幕国产精品| 97成人精品视频在线观看| 亚洲精品97久久| 中文字幕v亚洲ⅴv天堂| 日韩中文字幕在线看| 深夜成人在线观看| 97成人在线视频| 国产小视频91| 国产亚洲精品久久久久动| 欧美成人精品在线视频| 亚洲一区二区三区成人在线视频精品| 一本色道久久88亚洲综合88| 欧美丰满片xxx777| 国产精品一区二区三区免费视频| 国产区亚洲区欧美区| 亚洲欧美国产日韩中文字幕| 亚洲va国产va天堂va久久| 国产精品精品视频一区二区三区| 日韩黄色在线免费观看| 国产成人黄色av| 欧美性xxxxxx| 精品夜色国产国偷在线| zzijzzij亚洲日本成熟少妇| 日韩高清a**址| 伊人久久久久久久久久久| 国产成人精品久久二区二区| 亚洲成人精品视频| 精品亚洲va在线va天堂资源站| 亚洲成人在线视频播放| 中文字幕视频在线免费欧美日韩综合在线看| 色婷婷亚洲mv天堂mv在影片| 欧美性生活大片免费观看网址| 国产精品一区二区久久| 午夜免费日韩视频| 国产精品美女主播在线观看纯欲| 这里只有精品视频在线| 91色在线视频| 国产精品福利在线观看网址| 亚洲理论在线a中文字幕| 九九九热精品免费视频观看网站| 国产欧美久久久久久| 日韩电影免费在线观看| 91夜夜未满十八勿入爽爽影院| 色www亚洲国产张柏芝| 亚洲精品小视频| 日韩欧美在线视频| 久久久99免费视频| 69久久夜色精品国产69| 日韩在线视频中文字幕| 国产欧美精品日韩| 成人在线一区二区| 日韩在线视频观看正片免费网站| 国产精品精品视频| 中日韩美女免费视频网址在线观看| 中文字幕欧美日韩va免费视频| 欧美日韩国产综合新一区| 精品成人国产在线观看男人呻吟| 亚洲美女av电影| 国产精品十八以下禁看| 久久久久久久久久国产精品| 日韩免费看的电影电视剧大全| 亚洲国产小视频在线观看| 亚洲经典中文字幕| 欧美一级在线播放| 久久av资源网站| 精品日本高清在线播放| 亚洲国产第一页| 狠狠躁18三区二区一区| 日韩国产精品亚洲а∨天堂免| 奇门遁甲1982国语版免费观看高清| 国产成人涩涩涩视频在线观看| 久久中文字幕国产| 亚洲欧美日韩中文视频| 欧美丝袜美女中出在线| 亚洲国产精品久久| 日韩av一区二区在线| 日韩成人av网| 国产suv精品一区二区三区88区| 亚洲精品久久久一区二区三区|