1、需求

需要处理的数据格式:

2.2G /home/hik/sz 
36M /home/hik 
1.3G /opt/opsmgr/web/components/tomcat85linux64.1/

单位有K,M,G,T返回实体类应包括数据大小和单位(如K,M,G,T等)作为属性。

如果当前目录下为空,则显示0.0,没有单位。

2、定义返回实体类

hm-manage/src/main/java/com/hm/manage/dto/FileSizeInfo.java

package com.hm.manage.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileSizeInfo {
    double sizeValue;  // 数值部分(如2.2)
    String unit;  // 单位(如"G")
    String path;        // 路径(如"/home/hik/sz")
}

3、构造方法

hm-manage/src/main/java/com/hm/manage/utils/FileSizeParser.java

package com.hm.manage.utils;

import com.hm.manage.dto.FileSizeInfo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileSizeParser {
    // 匹配模式:数值(含小数点) + 单位字母 + 制表符 + 路径
    private static final Pattern LINE_PATTERN =
            Pattern.compile("^(\\d+\\.?\\d*)([TGMK]?)\\t(.+)$");

    /**
     * 解析文件大小信息行并转换为FileSizeInfo对象
     *
     * @param line 输入字符串行,应包含文件大小信息(格式示例:"12.3 KB")
     * @return FileSizeInfo 包含解析后的文件尺寸信息对象
     * @throws IllegalArgumentException 当输入行格式不符合预定义模式时抛出
     */
    public static FileSizeInfo parseLine(String line) {
        // 使用预定义正则表达式匹配并验证输入行格式
        Matcher matcher = LINE_PATTERN.matcher(line.trim());
        if (!matcher.find()) {
            throw new IllegalArgumentException("Invalid format: " + line);
        }

        // 从匹配结果中提取并转换三个组成部分:
        // 1. 数值部分转换为double类型
        // 2. 可选单位前缀(可能为空字符串)
        // 3. 基础单位字符串
        return new FileSizeInfo(
                Double.parseDouble(matcher.group(1)),
                matcher.group(2).isEmpty() ? "" : matcher.group(2),
                matcher.group(3)
        );
    }

    /***
     * 根据输入的文件信息,判断文件大小是否超过限制
     * @return
     */
    public static String getResult(FileSizeInfo fileSizeInfo,Double sizeline){
        // 如果文件的单位为空,直接返回正常
        if (fileSizeInfo.getUnit().isEmpty()) {
            return "正常";
        } else if (fileSizeInfo.getUnit().equals("T")) {
            return "异常";
        } else if (fileSizeInfo.getUnit().equals("K")) {
            return "正常";
        } else if (fileSizeInfo.getUnit().equals("M")) {
            return "正常";
        } else if (fileSizeInfo.getUnit().equals("G")) {
            if (fileSizeInfo.getSizeValue() > sizeline) {
                return "异常";
            }
            return "正常";
        } else {
            return "异常";
        }

    }

}