用Java解析人类可读的文件到字节

Mri*_*lla 4 java

我有一堆文件大小,我想解析.这些目前仅在GB中.以下是一些示例:

  • 1.2GB
  • 2.4GB

我想我应该将我的字节文件大小存储在一个Long值中,但我似乎无法弄明白.我是这样做的:

System.out.println(Float.parseFloat("1.2GB".replace("GB", ""))* 1024L * 1024L * 1024L);
Run Code Online (Sandbox Code Playgroud)

返回一个Float显示为的值1.28849024E9.如何Long以字节为单位获取文件大小的表示.

我对numeric数据类型有点困惑.谢谢.

Joã*_*lva 9

BigDecimal改为使用:

BigDecimal bytes = new BigDecimal("1.2GB".replace("GB", ""));
bytes = bytes.multiply(BigDecimal.valueOf(1024).pow(3));
long value = bytes.longValue();
Run Code Online (Sandbox Code Playgroud)

你可以把它放在一个方法中:

public static long toBytes(String filesize) {
    long returnValue = -1;
    Pattern patt = Pattern.compile("([\\d.]+)([GMK]B)", Pattern.CASE_INSENSITIVE);
    Matcher matcher = patt.matcher(filesize);
    Map<String, Integer> powerMap = new HashMap<String, Integer>();
    powerMap.put("GB", 3);
    powerMap.put("MB", 2);
    powerMap.put("KB", 1);
    if (matcher.find()) {
      String number = matcher.group(1);
      int pow = powerMap.get(matcher.group(2).toUpperCase());
      BigDecimal bytes = new BigDecimal(number);
      bytes = bytes.multiply(BigDecimal.valueOf(1024).pow(pow));
      returnValue = bytes.longValue();
    }
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

称之为:

long bytes = toBytes("1.2GB");
Run Code Online (Sandbox Code Playgroud)


Mar*_*nik 7

此功能将为您提供更通用的解决方案.它涵盖GB,MB和KB,并允许小数分隔符使用逗号和点.如果输入一个普通整数,它也会传递它.

public static long parseFilesize(String in) {
  in = in.trim();
  in = in.replaceAll(",",".");
  try { return Long.parseLong(in); } catch (NumberFormatException e) {}
  final Matcher m = Pattern.compile("([\\d.,]+)\\s*(\\w)").matcher(in);
  m.find();
  int scale = 1;
  switch (m.group(2).charAt(0)) {
      case 'G' : scale *= 1024;
      case 'M' : scale *= 1024;
      case 'K' : scale *= 1024; break;
      default: throw new IllegalArgumentException();
  }
  return Math.round(Double.parseDouble(m.group(1)) * scale);
}
Run Code Online (Sandbox Code Playgroud)