You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java打印文件/目录大小异常:1GB以上文件显示错误排查

Java文件/目录大小计算异常问题解决

我用Java实现文件/目录大小打印功能时,遇到1GB以上文件无法正确显示的问题。比如检查约1.3GB的文件时,输出结果为0.000 TB,调试发现if-else逻辑直接跳转到了else分支,怀疑是long类型上限导致的问题。

初始代码

long size;
String notation;
if (file.isDirectory()) {
    // 计算目录下所有文件的总大小
    size = 0;
    for (File f : file.listFiles()) {
        size += f.length();
    }
} else {
    // 普通文件直接获取大小
    size = file.length();
}

// 单位转换计算
long bytes = size;
long kilobytes = (bytes / 1024);
long megabytes = (kilobytes / 1024);
long gigabytes = (megabytes / 1024);
long terabytes = (gigabytes / 1024);
long petabytes = (terabytes / 1024);
long exabytes = (petabytes / 1024);
//long zettabytes = (exabytes / 1024);
//long yottabytes = (zettabytes / 1024);

if (size > 0 && size < kilobytes){
    notation = "B";
    System.out.println(size+notation);
} else if (size > kilobytes && size < megabytes) {
    // 文件小于1MB,以KB为单位返回
    size /= 1024;
    notation = "KB";
    System.out.println(size+notation);
} else if (size > megabytes && size < gigabytes) {
    // 文件小于1GB,以MB为单位返回
    notation = "MB";
    size /= 1024.0 * 1024;
    System.out.println(size+notation);
} else if (size > gigabytes && size < terabytes) {
    // 文件大于1GB,以GB为单位返回
    notation = "GB";
    size /= 1024.0 * 1024.0 * 1024.0;
    System.out.println(size+notation);
} else {
    // 文件大于1TB,以TB为单位返回
    notation = "TB";
    size /= 1024.0 * 1024.0 * 1024.0 * 1024;
    System.out.println(size+notation);
}

// 转换为double后格式化输出
return String.format("[Size: %.3f %s]", (double) size, notation);

调试显示:1.3GB的文件对应的size值为1395864371,但判断逻辑错误进入了TB分支。

尝试改进(未解决)

改用BigDecimal后数值看似正确,但逻辑仍跳转到TB分支。

最终解决方案

问题已解决,修正后的代码如下:

if (bsize.compareTo(BigDecimal.valueOf(1024)) < 0) {
    notation = "B";
    System.out.println(bsize+notation);
} else if (bsize.compareTo(BigDecimal.valueOf(1024*1024)) < 0) {
    // 文件小于1MB,以KB为单位返回
    bsize = bsize.divide(BigDecimal.valueOf(1024));
    notation = "KB";
    System.out.println(bsize+notation);
} else if (bsize.compareTo(BigDecimal.valueOf(1024L*1024L*1024L)) < 0) {
    // 文件小于1GB,以MB为单位返回
    notation = "MB";
    bsize = bsize.divide(BigDecimal.valueOf(1024*1024));
    System.out.println(bsize+notation);
} else if (bsize.compareTo(BigDecimal.valueOf(1024L*1024L*1024L*1024L)) < 0) {
    // 文件大于1GB,以GB为单位返回
    notation = "GB";
    System.out.println(bsize+notation);
    bsize = bsize.divide(BigDecimal.valueOf(1024*1024*1024));
    System.out.println(bsize+notation);
} else {
    // 文件大于1TB,以TB为单位返回
    notation = "TB";
    bsize = bsize.divide(BigDecimal.valueOf(1024L*1024L*1024L*1024L));
    System.out.println(bsize+notation);
}

内容的提问来源于stack exchange,提问作者Thend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:45:29