Java - 将人类可读大小转换为字节

2022-09-04 05:37:03

我发现了很多关于将原始字节信息转换为人类可读格式的信息,但我需要做相反的事情,即将字符串“1.6 GB”转换为长值1717990000。有没有一个内置的/定义明确的方法来做到这一点,或者我几乎必须自己滚动?

[编辑]:这是我的第一刀...

static class ByteFormat extends NumberFormat {
    @Override
    public StringBuffer format(double arg0, StringBuffer arg1, FieldPosition arg2) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public StringBuffer format(long arg0, StringBuffer arg1, FieldPosition arg2) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Number parse(String arg0, ParsePosition arg1) {
        return parse (arg0);
    }

    @Override
    public Number parse(String arg0) {
        int spaceNdx = arg0.indexOf(" ");
        double ret = Double.parseDouble(arg0.substring(0, spaceNdx));
        String unit = arg0.substring(spaceNdx + 1);
        int factor = 0;
        if (unit.equals("GB")) {
            factor = 1073741824;
        }
        else if (unit.equals("MB")) {
            factor = 1048576;
        }
        else if (unit.equals("KB")) {
            factor = 1024;
        }

        return ret * factor;
    }
}

答案 1

Spring Framework在5.1版本上添加了一个类,该类允许将人类可读的数据大小解析为字节,并将它们格式化回人类可读的形式。可以在这里找到它。DataSize

如果使用Spring框架,则可以升级到>=5.1并使用此类。否则,您可以c / p它和相关类(同时遵守许可证)。

然后你可以使用它:

DataSize dataSize = DataSize.parse("16GB");
System.out.println(dataSize.toBytes());

将给出输出:

17179869184

但是,用于解析输入的模式

  • 不支持小数(因此,您可以使用 、 、 、1GB2GB1638MB1.6GB)
  • 不支持空格(因此,您可以使用但不能使用1GB1 GB)

我建议坚持兼容性/易于维护的惯例。但是,如果这不符合您的需求,则需要复制和编辑文件 - 这是一个很好的起点。


答案 2

我从未听说过这样一个著名的库,它实现了这样的文本解析实用程序方法。但是您的解决方案似乎离正确的实现还很接近。

我想在你的代码中纠正的仅有的两件事是:

  1. 将方法定义为静态,因为它具有实用性Number parse(String arg0)

  2. 将每种类型的大小定义 s 定义为字段。factorfinal static

即,它将像这样:

private final static long KB_FACTOR = 1024;
private final static long MB_FACTOR = 1024 * KB_FACTOR;
private final static long GB_FACTOR = 1024 * MB_FACTOR;

public static double parse(String arg0) {
    int spaceNdx = arg0.indexOf(" ");
    double ret = Double.parseDouble(arg0.substring(0, spaceNdx));
    switch (arg0.substring(spaceNdx + 1)) {
        case "GB":
            return ret * GB_FACTOR;
        case "MB":
            return ret * MB_FACTOR;
        case "KB":
            return ret * KB_FACTOR;
    }
    return -1;
}