总是发现自己的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 zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类的成员 199 实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 ...
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped...
JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形...
请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句: session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1) 其实还有更简单的方法,而且是更好的方法,使用合理描述参数和...
关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种...
开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...
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 位置和...
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......
以及引入了命令行工具 Appcmd.exe ,给 Web 服务器的日常管理、监视和配置提供了除图形接口外的另一种方式,更为简单、高效。 同Windows XP一样,在Windows Vista的默认设置下,IIS (Internet 信息服务) 7.0未予安装...