¿Cómo puedo convertir el tamaño de un byte a un formato legible por humanos en Java?

Resuelto Igor Mukhin asked hace 14 años • 31 respuestas

¿Cómo puedo convertir el tamaño de un byte a un formato legible por humanos en Java?

Por ejemplo, 1024 debería convertirse en "1 Kb" y 1024*1024 debería convertirse en "1 Mb".

Estoy un poco harto de escribir este método de utilidad para cada proyecto. ¿Existe un método estático en Apache Commons para esto?

Igor Mukhin avatar Sep 21 '10 15:09 Igor Mukhin
Aceptado

Dato curioso: el fragmento original publicado aquí fue el fragmento de Java más copiado de todos los tiempos en Stack Overflow y tenía fallas. Se arregló, pero se volvió complicado.

Historia completa en este artículo: ¡ El fragmento de Stack Overflow más copiado de todos los tiempos tiene errores!

Fuente: Formato del tamaño de bytes a formato legible por humanos | Guía.de.programación

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

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

Salida de ejemplo:

                             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 avatar Sep 21 '2010 09:09 aioobe

FileUtils.byteCountToDisplaySize(long size)Funcionaría si su proyecto puede depender de él org.apache.commons.io.

JavaDoc para este método

user601806 avatar Feb 03 '2011 15:02 user601806