博客
关于我
在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 5.X 报错 ERROR 1193 (HY000): Unknown system variable ‘validate_password_length‘
    查看>>
    MySQL:MySQL执行一条SQL查询语句的执行过程
    查看>>
    Mysql:SQL性能分析
    查看>>
    mysql:SQL按时间查询方法总结
    查看>>
    MySQL:什么样的字段适合加索引?什么样的字段不适合加索引
    查看>>
    MySQL:判断逗号分隔的字符串中是否包含某个字符串
    查看>>
    MySQL:某个ip连接mysql失败次数过多,导致ip锁定
    查看>>
    Mysql:避免重复的插入数据方法汇总
    查看>>
    m_Orchestrate learning system---二十二、html代码如何变的容易
    查看>>
    n = 3 , while n , continue
    查看>>
    n 叉树后序遍历转换为链表问题的深入探讨
    查看>>
    N-Gram的基本原理
    查看>>
    nacos config
    查看>>
    Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
    查看>>
    Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
    查看>>
    NacosClient客户端搭建,微服务注册进nacos
    查看>>
    Nacos原理
    查看>>
    Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
    查看>>
    Nacos启动异常
    查看>>
    Nacos和Zookeeper对比
    查看>>