如何统计Java中TreeNode<File>对应目录及子目录所有文件的总大小?
问题根因
你遇到的类型转换报错核心是:当前逻辑没有复用TreeNode<File>已封装的子节点结构,反而通过tree.data.listFiles()获取到了原生File类型的子文件/目录对象,自然无法直接传入要求TreeNode<File>参数的递归方法。
解决方案
提供两种可选实现方式:
方案1:复用现有TreeNode结构(推荐)
假设你的TreeNode类内置了子节点集合(可通过getChildren()方法获取所有子TreeNode<File>对象),直接遍历TreeNode的子节点做递归即可,无需重复调用File接口读文件系统:
public static long calculateFileSize(TreeNode<File> tree) { long fileSize = 0; File currentFile = tree.data; // 累加当前文件/目录本身的大小(目录在多数文件系统中也有存储占用) fileSize += currentFile.length(); // 如果是目录,递归累加所有子节点的大小 if (currentFile.isDirectory() && tree.getChildren() != null) { for (TreeNode<File> childNode : tree.getChildren()) { fileSize += calculateFileSize(childNode); } } return fileSize; }
该方案优势是复用已经构建好的TreeNode树结构,不需要重复读取文件系统,性能更高。
方案2:重载File类型入参的递归方法
如果你需要直接通过文件系统读取子项,可重载一个入参为File类型的递归方法:
public static long calculateFileSize(TreeNode<File> tree) { // 调用重载的File参数方法执行递归统计 return calculateFileSize(tree.data); } // 私有重载方法:入参为File类型,负责实际递归计算 private static long calculateFileSize(File file) { long fileSize = file.length(); if (file.isDirectory()) { File[] children = file.listFiles(); // 判空避免无读取权限、目录被删除等场景下触发空指针 if (children != null) { for (File child : children) { fileSize += calculateFileSize(child); } } } return fileSize; }
注意事项
- 必须对
listFiles()的返回值做判空处理,当应用无目录读取权限、目录被临时删除等场景下,listFiles()会返回null,不加判空会触发空指针异常。 - 如果不需要统计目录本身的存储占用,仅统计目录下所有文件的总大小,可只在
file.isFile()成立时累加file.length()即可。
内容的提问来源于stack exchange,提问作者Richard Walker
相关产品推荐
相关产品推荐

