文件大小单位转换

来源:互联网 发布:java发短信 编辑:程序博客网 时间:2024/04/28 09:27

 
import java.text.DecimalFormat;
import java.util.Hashtable;

/**
 * 文件大小单位转换
 * @author Administrator
 *
 */
public class UnitsConversion extends DecimalFormat {

    private static final long serialVersionUID = 3168068393840262910L;
    /**
     * 存放有效单位的数组
     */
    private static Hashtable<String, String> validUnits = new Hashtable<String, String>();
    /**
     * 限制文件大小上限为1G
     */
    private static int GB_MAX_SIZE = 1;
    /**
     * 最大的MB值
     */
    private static int MB_MAX_SIZE = GB_MAX_SIZE * 1024;
    /**
     * 最大的KB值
     */
    private static int KB_MAX_SIZE = MB_MAX_SIZE * 1024;
    /**
     * 最大的Bytes值
     */
    private static int BYTES_MAX_SIZE = KB_MAX_SIZE * 1024;
    /**
     * 数字部分的值
     */
    private Double numPart;
    /**
     * 原始的单位字符串
     */
    private String originalUnit;
    /**
     * 标准的单位字符串
     */
    private String unit;
    /**
     * 转换后的结果
     */
    private String result;

    // 添加所有有效单位
    static {
        validUnits.put("字节", "Bytes");
        validUnits.put("bytes", "Bytes");
        validUnits.put("byte", "Bytes");
        validUnits.put("kb", "KB");
        validUnits.put("k", "KB");
        validUnits.put("兆", "MB");
        validUnits.put("mb", "MB");
        validUnits.put("m", "MB");
        validUnits.put("gb", "GB");
        validUnits.put("g", "GB");
    }

    /**
     * 构造方法:指定了数字格式,初始所有属性为NULL
     */
    public UnitsConversion() {
        super("########.##");
        numPart = null;
        result = null;
        unit = null;
        originalUnit = null;
    }

    /**
     * 根据单位、数字大小按照常用的转换原则进行转换
     *
     * @param input
     * @return 成功转换后的结果是非空字符串;若失败了,结果为空字符串
     */
    public String defaultConversion(String input) {
        analyzeString(input);
        if (result != null) {
            return result;
        }
        // 单位 Bytes
        if (unit.equals("Bytes")) {
            int numPart2Int = numPart.intValue();
            // 输入大小与1G相差0.5M之内,返回1GB
            if ((BYTES_MAX_SIZE - numPart2Int) < (1024 * 1024) / 2) {
                return "1 GB";
            }
            // (0,1KB)
            if (numPart2Int < 1024) {
                return numPart2Int + " Bytes";
            }
            // [1KB,1023KB]
            if (numPart2Int >= 1024 && numPart2Int <= (1024 - 1) * 1024) {
                return format(numPart / 1024) + " KB";
            }
            // (1023KB,1GB)
            if (numPart2Int > (1024 - 1) * 1024 && numPart2Int < BYTES_MAX_SIZE) {
                return format(numPart / (1024 * 1024)) + " MB";
            } else
                result = "";
            return result;
        }

        if (unit.equals("KB")) {
            return "还没实现....";
        }

        if (unit.equals("MB")) {
            return "还没实现....";
        }

        if (unit.equals("GB")) {
            return "还没实现....";
        }
        result = "";
        return result;
    }

    /**
     * 把字符串的数字部分与单位分离,并对数字、单位的有效性进行检验, 若有非法状况,把结果赋值为 "" ,将其返回给用户
     *
     * @param input
     */
    public void analyzeString(String input) {
        // 初步检验输入的字符串
        if (input == null || input.trim().length() < 2) {
            System.out.println("输入的字符串有误");
            result = "";
            return;
        }
        input = input.replaceAll(" ", "");
        int firstIndexOfUnit;// 单位的起始位置
        String strOfNum;// 数字部分的字符串
        // 从尾部开始遍历字符串
        for (int i = input.length() - 1; i >= 0; i--) {
            if (Character.isDigit(input.charAt(i))) {
                firstIndexOfUnit = i + 1;
                originalUnit = input.substring(firstIndexOfUnit,
                        input.length()).toLowerCase();
                if (!isValidUnit(originalUnit)) {
                    System.out.println("无效单位。");
                    result = "";
                    return;
                }
                unit = validUnits.get(originalUnit);
                strOfNum = input.substring(0, firstIndexOfUnit);
                numPart = Double.parseDouble(strOfNum);
                if (!isValidNum(numPart, unit)) {
                    System.out.println("文件大小非法");
                    result = "";
                    return;
                }
                if (numPart == 0) {
                    result = "0 Bytes";
                    return;
                }
                break;
            }
        }
        if (unit == null || numPart == null) {
            System.out.println("输入的字符串有误");
            result = "";
            return;
        }

    }

    /**
     * 文件大小越界检查
     *
     * @param num
     * @param unit
     * @return 在1G范围内(包括1G),返回true;否则返回false
     */
    public boolean isValidNum(Double num, String unit) {
        if (num == null || num < 0 || num > BYTES_MAX_SIZE) {
            return false;
        }
        if (unit.equals("KB") && num > KB_MAX_SIZE) {
            return false;
        }
        if (unit.equals("MB") && num > MB_MAX_SIZE) {
            return false;
        }
        if (unit.equals("GB") && num > GB_MAX_SIZE) {
            return false;
        }
        return true;
    }

    /**
     * 检查原始单位originalUnit是否有效
     *
     * @param originalUnit
     * @return 若originalUnit为空,那么会给他赋默认值 bytes ,并返回true;<br>
     *         若originalUnit是有效单位集合中之一,返回true。
     */
    public boolean isValidUnit(String originalUnit) {
        if (originalUnit == null || originalUnit.trim().length() < 1) {
            originalUnit = "bytes";
            return true;
        }
        for (String validUnit : validUnits.keySet()) {
            if (validUnit.equalsIgnoreCase(originalUnit)) {
                return true;
            }
        }
        return false;
    }
    //测试
    public static void main(String[] args) {
        System.out.println("-------------");
        for (int i = 1020 * 1024; i <= 1024 * 1111; i += 9) {
            String input = i + " ";
            System.out.println(input + " ---> "
                    + new UnitsConversion().defaultConversion(input));
        }
    }

}


 

原创粉丝点击