How can I convert byte size into a human-readable format in Java? How can I convert byte size into a human-readable format in Java? java java

How can I convert byte size into a human-readable format in Java?


Fun fact: The original snippet posted here was the most copied Java snippet of all time on Stack Overflow, and it was flawed. It was fixed, but it got messy.

Full story in this article: The most copied Stack Overflow snippet of all time is flawed!

Source: 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)


FileUtils.byteCountToDisplaySize(long size) would work if your project can depend on org.apache.commons.io.

JavaDoc for this method


Use an Android built-in class

For Android, there is a class, Formatter. Just one line of code and you are done.

android.text.format.Formatter.formatShortFileSize(activityContext, bytes);

It is like formatFileSize(), but trying to generate shorter numbers (showing fewer decimals).

android.text.format.Formatter.formatFileSize(activityContext, bytes);

It formats a content size to be in the form of bytes, kilobytes, megabytes, etc.