Java目录大小统计:空目录资源获取异常问题求助
解决空目录无法通过类加载器获取的问题
问题根源
ClassLoader.getResource(directoryName) 对空目录返回null的核心原因是:类加载器的资源查找机制优先识别包含文件的资源节点,空目录在编译或打包流程中(比如Maven默认行为)可能不会被复制到输出目录;即使目录存在于文件系统中,类加载器也不会将空目录视为可获取的资源,因此返回null。
解决方案:从资源根目录拼接路径
绕过类加载器对单个目录的资源查找逻辑,先获取资源根目录的实际路径,再拼接目标目录名,直接在文件系统层面检查目录状态并计算大小。
完整实现代码
import java.io.File; import java.net.URL; public class DirectorySizeChecker { public long checkSize(String directoryName) { // 获取测试资源根目录的URL(对应target/test-classes) URL rootResource = getClass().getClassLoader().getResource(""); if (rootResource == null) { return 0; } // 转换为File对象,拼接目标目录路径 File rootDir = new File(rootResource.getFile()); File targetDir = new File(rootDir, directoryName); // 目录不存在或不是合法目录,返回0 if (!targetDir.exists() || !targetDir.isDirectory()) { return 0; } // 递归计算目录总大小 return calculateDirectorySize(targetDir); } private long calculateDirectorySize(File directory) { long totalSize = 0; File[] files = directory.listFiles(); if (files == null) { return 0; } for (File file : files) { if (file.isDirectory()) { totalSize += calculateDirectorySize(file); } else { totalSize += file.length(); } } return totalSize; } }
代码说明
- 定位资源根目录:通过
getResource("")获取测试资源的根路径,确保能覆盖所有test/resources下的目录。 - 直接检查目录状态:拼接目标目录名后,用
File类的原生方法判断目录是否存在、是否为合法目录,不受类加载器资源规则限制。 - 递归计算大小:遍历目录下所有文件和子目录,累加文件长度;空目录会自然返回0,完全匹配测试场景需求。
额外优化(可选)
如果使用Maven构建,默认不会复制空目录到输出目录,可在pom.xml中配置插件强制保留空目录:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <configuration> <includeEmptyDirs>true</includeEmptyDirs> </configuration> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者Svetlana
相关产品推荐
相关产品推荐

