首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8 NIO >递归检索目录大小的更有效方法?

Java8 NIO >递归检索目录大小的更有效方法?
EN

Stack Overflow用户
提问于 2016-11-18 03:22:37
回答 1查看 88关注 0票数 0

对于给定的目录,我试图递归地检索每个目录的大小(以尽可能高效的方式)。如果可能的话,我想利用Java8的NIO流(为了速度和效率),但我会使用第三方库(为什么要重新发明轮子)。

例如,在遍历每个级别时,迭代目录深度(首先,总结子文件/prev计算出的目录大小)的效率会更高。我目前的解决方案效率低下,因为它从顶层开始重新计算目录大小。

任何图书馆建议/代码示例/指南将不胜感激.

当前解决方案:

代码语言:javascript
复制
import java.io.IOException;
import java.nio.file.*;
import java.util.Map;

import static java.util.stream.Collectors.toMap;

public class DirectorySizes {

    public static void main(String[] args) throws IOException {
        // retrieve map of path -> size...
        Map<Path, Long> directorySize = Files.walk(Paths.get("/tmp"))
                .filter(Files::isDirectory)
                .collect(toMap(Path::toAbsolutePath, DirectorySizes::getDirectorySize));
        // print {size} {directory}...
        directorySize.entrySet().forEach(e ->
                System.out.printf("%15s  %s %n", e.getValue(), e.getKey())
        );
    }

    public static long getDirectorySize(Path path) {
        try {
            return Files.walk(path).filter(Files::isRegularFile)
                    .mapToLong(DirectorySizes::getFileSize).sum();
        } catch (IOException e) {
            return 0;
        }
    }

    public static long getFileSize(Path file) {
        try {
            return Files.size(file);
        } catch (IOException e) {
            return 0;
        }
    }

}

示例输出:

代码语言:javascript
复制
       2812  C:\tmp\foobar\static\css 
       6936  C:\tmp\foobar\static 
       7821  C:\tmp\foobar
EN

回答 1

Stack Overflow用户

发布于 2016-11-18 03:33:42

有几处更改可能会有所帮助:

  • 您的FileVisitor被传递给一个包含文件大小的BasicFileAttributes。您不需要使用Files.size重新计算它。
  • walkFileTree已经是深度第一。当你走在树上的时候,你应该能够收集尺寸信息来整理。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40668841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档