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

比如1024应该变成"1KB",1024*1024应该变成"1MB".

我有点厌倦了 for each 项目编写这种实用方法.在Apache Commons中有没有静态方法?

推荐答案

Fun fact:这里发布的原始代码段是有史以来在堆栈溢出上复制最多的Java代码段,而且存在缺陷.它被修好了,但弄得一团糟.

本文的完整故事:The most copied Stack Overflow snippet of all time is flawed!

资料来源:Formatting byte size to human readable format | Programming.Guide

SI (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());
}

Binary (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());
}

Example output:

                              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)

Java相关问答推荐

我想知道为什么我的控制器给出嵌套响应

无法在Java中使用Curve secp 256 k1验证JWT

如何在Inspaut中获取当前路径的 * 模式 *?

JPackage-results已安装-如何添加系统属性?

JsonPath在多个线程中返回错误的值

最小拓Flutter 排序的时间复杂度是多少?

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

名称冲突具有相同的擦除

如何在ApachePOI中将图像添加到工作表的页眉?

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

从Spring6中的JPMS模块读取类时出现问题

从泛型枚举创建EnumMap

具有多个模式的DateTimeForMatter的LocalDate.parse失败

嘲笑黄瓜中的对象

在Eclipse中可以使用外部字体吗?

为什么项目名称出现在我的GET请求中?

验证没有';t work on Hibernate Entity';s字段

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

在数组中查找素数时出现逻辑错误