对于给定的目录,我试图递归地检索每个目录的大小(以尽可能高效的方式)。如果可能的话,我想利用Java8的NIO流(为了速度和效率),但我会使用第三方库(为什么要重新发明轮子)。
例如,在遍历每个级别时,迭代目录深度(首先,总结子文件/prev计算出的目录大小)的效率会更高。我目前的解决方案效率低下,因为它从顶层开始重新计算目录大小。
任何图书馆建议/代码示例/指南将不胜感激.
当前解决方案:
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;
}
}
}示例输出:
2812 C:\tmp\foobar\static\css
6936 C:\tmp\foobar\static
7821 C:\tmp\foobar发布于 2016-11-18 03:33:42
有几处更改可能会有所帮助:
FileVisitor被传递给一个包含文件大小的BasicFileAttributes。您不需要使用Files.size重新计算它。https://stackoverflow.com/questions/40668841
复制相似问题