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
相关产品推荐
相关产品推荐

