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
.
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.