博客
关于我
在Java里怎将字节数转换为我们可以读懂的格式?
阅读量:776 次
发布时间:2019-03-24

本文共 2243 字,大约阅读时间需要 7 分钟。

如何将Java中的字节数转换为人类可读的格式

在Java开发过程中,有时需要将字节数转换为人类易于理解的单位格式。例如,1024字节((Byte))应转换为"1 Kb",而1024*1024(MiB)应转换为"1 MiB"。企业开发中,重复编写这样的工具方法可能对开发效率产生不利影响。因此,寻找一种通用的解决方案显得尤为重要。

基于十进制的字节数转换

如前所述,阿帕奇 Commons 库中并未提供直接支持字节数转换为人类可读格式的静态方法。但我们可以编写自定义工具方法来解决这个问题。以下是两种常见的转换方法:

1. 基于SI(千分位制)的转换

这种方法的核心思想是将字节数除以1000,直到剩下的字节数小于等于999,以获取适当的单位表示。

public static String humanReadableByteCountSI(long bytes) {    if (bytes >= -1000 && 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());}

示例输出

  • 1024 → "1.0 kB"
  • 1728 → "1.7 kB"
  • 1105920 → "1106.2 kB"

优点:适用于大部分应用场景,代码简洁。

缺点:不符合现代系统中的kiB到TiB转换标准。

2. 基于二进制位的转换

与第1种方法不同,这种方法将字节数除以1024,逐步缩小单位以达到适当的表示效果。

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

示例输出

  • 1024 → "1.0 Ki"
  • 4096 → "4.0 Ki"
  • 1048576 → "1.0 Mi"

优点:更符合现代计算机存储习惯。

缺点:代码逻辑复杂,难以维护。

进一步优化的思路

在实际开发中,可以根据具体需求选择上述方法中的一个,或者结合两者进行定制化。为了避免每个项目都编写单独的工具方法,建议在团队内部达成一致的字节数转换标准。例如,可以创建一个通用的工具类,如BytesFormat Utils,集中管理所有转换逻辑。

此外,还可以利用Java 8的新特性,例如拆分多方法(split methods)结合链式调用,提高代码的可重用性和可读性。

当前实现的示例

以下代码展示了两种方法的实现和测试结果:

SI 单位示例

humanReadableByteCountSI(1000) → "1.0 kB"  humanReadableByteCountSI(2000) → "2.0 kB"  humanReadableByteCountSI(1024*1024) → "1.0 kB"

二进制单位示例

humanReadableByteCountBin(1024) → "1.0 KiB"  humanReadableByteCountBin(2048) → "2.0 KiB"  humanReadableByteCountBin(1024*1024*1024) → "1.0 MiB"

验证测试

为了确保转换逻辑的准确性,可以编写单元测试。例如:

  • 测试范围在千字和百万字范围内的字节数是否正确转换为KB、MB、GB等。
  • 验证不同负值字节数是否正确显示为"-"符号。

最终考虑

在实际项目中,应根据具体需求选择适用的转换方法或者实现自定义逻辑。建议如下:

  • 需求分析:明确目标格式输出的单位和精度。
  • 选择方法:根据实际应用场景选择适用的转换方式(SI或二进制单位)。
  • 代码复用:避免重复编写同类型逻辑,尽量复用现有的工具方法。
  • 测试覆盖:编写充分的单元测试,确保代码正常运行。
  • 通过以上方法,可以有效地将Java中的字节数转换为用户端易于理解的格式,同时尽量降低代码冗余。

    转载地址:http://xbekk.baihongyu.com/

    你可能感兴趣的文章
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>