如何在 Java 中将字节大小转换为人类可读的格式?

新手上路,请多包涵

如何在 Java 中将字节大小转换为人类可读的格式?

比如 1024 应该变成“1 Kb”,1024*1024 应该变成“1 Mb”。

我有点厌倦了为每个项目编写这种实用方法。 Apache Commons 中是否有为此的静态方法?

原文由 Igor Mukhin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 764
2 个回答

有趣的事实: 这里发布的原始代码段是 Stack Overflow 上有史以来被复制最多的 Java 代码段,但它存在缺陷。它已修复,但它变得混乱。

本文全文: 有史以来被复制最多的 Stack Overflow 片段存在缺陷!

来源: 将字节大小格式化为人类可读的格式 |编程指南

国际单位制 (1 k = 1,000)

 public static String humanReadableByteCountSI(long bytes) {
    if (-1000 < bytes && bytes < 1000) {
        return bytes + " B";
    }
    CharacterIterator ci = new StringCharacterIterator("kMGTPE");
    while (bytes <= -999_950 || bytes >= 999_950) {
        bytes /= 1000;
        ci.next();
    }
    return String.format("%.1f %cB", bytes / 1000.0, ci.current());
}

二进制 (1 Ki = 1,024)

 public static String humanReadableByteCountBin(long bytes) {
    long absB = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);
    if (absB < 1024) {
        return bytes + " B";
    }
    long value = absB;
    CharacterIterator ci = new StringCharacterIterator("KMGTPE");
    for (int i = 40; i >= 0 && absB > 0xfffccccccccccccL >> i; i -= 10) {
        value >>= 10;
        ci.next();
    }
    value *= Long.signum(bytes);
    return String.format("%.1f %ciB", value / 1024.0, ci.current());
}

示例输出:

                              SI     BINARY

                  0:        0 B        0 B
                 27:       27 B       27 B
                999:      999 B      999 B
               1000:     1.0 kB     1000 B
               1023:     1.0 kB     1023 B
               1024:     1.0 kB    1.0 KiB
               1728:     1.7 kB    1.7 KiB
             110592:   110.6 kB  108.0 KiB
            7077888:     7.1 MB    6.8 MiB
          452984832:   453.0 MB  432.0 MiB
        28991029248:    29.0 GB   27.0 GiB
      1855425871872:     1.9 TB    1.7 TiB
9223372036854775807:     9.2 EB    8.0 EiB   (Long.MAX_VALUE)

原文由 aioobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

FileUtils.byteCountToDisplaySize(long size) 如果您的项目可以依赖 org.apache.commons.io 就可以工作。

此方法的 JavaDoc

原文由 user601806 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题