`

存储大小转换

    博客分类:
  • java
阅读更多
一个很实用的单位转换工具类(使用了策略枚举的模式, 这个专业名词找了我好久, 一时忘记了 ):
/***
 * 存储大小(单位)转换器.
 */
public enum SizeConverter {
    /** 转换任意单位的大小, 返回结果会包含两位小数但不包含单位. */
    Arbitrary {
        @Override
        public String convert(float size) {
            while (size > 1024) {
                size /= 1024;
            }
            return String.format(FORMAT_F, size);
        }
    },
    
    // -----------------------------------------------------------------------
    // 有单位
    /** 转换单位为B的大小, 返回结果会包含两位小数以及单位. 如: 1024B->1KB, (1024*1024)B->1MB */
    B {
        @Override
        public String convert(float B) {
            return converter(0, B);
        }
    },
    /** 转换单位为B的大小, 返回结果会包含两位小数以及单位. */
    KB {
        @Override
        public String convert(float KB) {
            return converter(1, KB);
        }
    },
    /** 转换单位为MB的大小, 返回结果会包含两位小数以及单位. */
    MB {
        @Override
        public String convert(float MB) {
            return converter(2, MB);
        }
    },
    /** 转换单位为GB的大小, 返回结果会包含两位小数以及单位. */
    GB {
        @Override
        public String convert(float GB) {
            return converter(3, GB);
        }
    },
    /** 转换单位为TB的大小, 返回结果会包含两位小数以及单位. */
    TB {
        @Override
        public String convert(float TB) {
            return converter(4, TB);
        }
    },
    
    // -----------------------------------------------------------------------
    // trim没单位
    /** 转换任意单位的大小, 返回结果小数部分为0时将去除两位小数, 不包含单位. */
    ArbitraryTrim {
        @Override
        public String convert(float size) {
            while (size > 1024) {
                size /= 1024;
            }

            int sizeInt = (int) size;
            boolean isfloat = size - sizeInt > 0.0F;
            if (isfloat) {
                return String.format(FORMAT_F, size);
            }
            return String.format(FORMAT_D, sizeInt);
        }
    },
    
    // -----------------------------------------------------------------------
    // trim有单位
    /** 转换单位为B的大小, 返回结果小数部分为0时将去除两位小数, 会包含单位. */
    BTrim {
        @Override
        public String convert(float B) {
            return trimConverter(0, B);
        }
    },
    /** 转换单位为KB的大小, 返回结果小数部分为0时将去除两位小数, 会包含单位. */
    KBTrim {
        @Override
        public String convert(float KB) {
            return trimConverter(1, KB);
        }
    },
    /** 转换单位为MB的大小, 返回结果小数部分为0时将去除两位小数, 会包含单位. */
    MBTrim {
        @Override
        public String convert(float MB) {
            return trimConverter(2, MB);
        }
    },
    /** 转换单位为GB的大小, 返回结果小数部分为0时将去除两位小数, 会包含单位. */
    GBTrim {
        @Override
        public String convert(float GB) {
            return trimConverter(3, GB);
        }
    },
    /** 转换单位为TB的大小, 返回结果小数部分为0时将去除两位小数, 会包含单位. */
    TBTrim {
        @Override
        public String convert(float TB) {
            return trimConverter(4, TB);
        }
    };
    /***
     * <p> 将指定的大小转换到1024范围内的大小. 注意该方法的最大单位为PB, 最小单位为B, 
     * 任何超出该范围的单位最终会显示为**. </p>
     * 
     * @param size 要转换的大小, 注意是浮点数, 不要以整形的方式传入, 容易造成溢出.
     *         (如: 1024*1024*1024*1024*1024会溢出, 使结果为0, 因为它先将结果以int相乘后再转换为float; 
     *         而1024.0F*1024.0F*1024.0F*1024.0F*1024.0F就不会溢出)
     * @return
     */
    abstract public String convert(float size);
    
    // -----------------------------------------------------------------------
    // 单位转换
    
    private static final String[] UNITS = new String[] {
        "B", "KB", "MB", "GB", "TB", "PB", "**"
    };
    
    private static final int LAST_IDX = UNITS.length-1;
    
    private static final String FORMAT_F = "%1$-1.2f";
    private static final String FORMAT_F_UNIT = "%1$-1.2f%2$s";
    
    private static final String FORMAT_D = "%1$-1d";
    private static final String FORMAT_D_UNIT = "%1$-1d%2$s";
    
    // -----------------------------------------------------------------------
    private static String converter(int unit, float size) {
        int unitIdx = unit;
        while (size > 1024) {
            unitIdx++;
            size /= 1024;
        }
        int idx = unitIdx < LAST_IDX ? unitIdx : LAST_IDX;
        return String.format(FORMAT_F_UNIT, size, UNITS[idx]);
    }
    
    private static String trimConverter(int unit, float size) {
        int unitIdx = unit;
        while (size > 1024) {
            unitIdx++;
            size /= 1024;
        }

        int sizeInt = (int) size;
        boolean isfloat = size - sizeInt > 0.0F;
        int idx = unitIdx < LAST_IDX ? unitIdx : LAST_IDX;
        if (isfloat) {
            return String.format(FORMAT_F_UNIT, size, UNITS[idx]);
        }
        return String.format(FORMAT_D_UNIT, sizeInt, UNITS[idx]);
    }
    
    // -----------------------------------------------------------------------
    public static String convertBytes(float B, boolean trim) {
        return trim ? trimConvert(0, B, true) : convert(0, B, true);
    }
    
    public static String convertKB(float KB, boolean trim) {
        return trim ? trimConvert(1, KB, true) : convert(1, KB, true);
    }
    
    public static String convertMB(float MB, boolean trim) {
        return trim ? trimConvert(2, MB, true) : convert(2, MB, true);
    }
    
    /***
     * <p> 存储大小单位间的转换. 注意该方法的最大单位为PB, 最小单位为B, 
     * 任何超出该范围的单位最终会显示为**. </p>
     * 
     * @param unit 从哪个单位开始
     * @param size 存储大小, 注意是float, 不要以整形的形式传入, 否则会溢出(如:1024*1024这种,
     * 它是先将1024*1024作为int相乘再转换为float的, 如果值过大的话就会溢出了, 
     * 所以这么写1024.0F*1024.0F)
     * @param withUnit 返回的结果字符串是否带有对应的单位
     * @return
     */
    private static String convert(int unit, float size, boolean withUnit) {
        int unitIdx = unit;
        while (size > 1024) {
            unitIdx++;
            size /= 1024;
        }
        if (withUnit) {
            int idx = unitIdx < LAST_IDX ? unitIdx : LAST_IDX;
            return String.format(FORMAT_F_UNIT, size, UNITS[idx]);
        }
        return String.format(FORMAT_F, size);
    }
    
    /***
     * <p> 存储大小单位间的转换, 如果转换后小数部分为0, 则去除小数部分. 
     * 注意该方法的最大单位为PB, 最小单位为B, 任何超出该范围的单位最终会显示为**. </p>
     * 
     * @param unit 从哪个单位开始
     * @param size 存储大小, 注意是float, 不要以整形的形式传入, 否则会溢出(如:1024*1024这种,
     * 它是先将1024*1024作为int相乘再转换为float的, 如果值过大的话就会溢出了, 
     * 所以这么写1024.0F*1024.0F)
     * @param withUnit 返回的结果字符串是否带有对应的单位
     * @return
     */
    private static String trimConvert(int unit, float size, boolean withUnit) {
        int unitIdx = unit;
        while (size > 1024) {
            unitIdx++;
            size /= 1024;
        }

        int sizeInt = (int) size;
        boolean isfloat = size - sizeInt > 0.0F;
        if (withUnit) {
            int idx = unitIdx < LAST_IDX ? unitIdx : LAST_IDX;
            if (isfloat) {
                return String.format(FORMAT_F_UNIT, size, UNITS[idx]);
            }
            return String.format(FORMAT_D_UNIT, sizeInt, UNITS[idx]);
        }

        if (isfloat) {
            return String.format(FORMAT_F, size);
        }
        return String.format(FORMAT_D, sizeInt);
    }
}

分享到:
评论

相关推荐

    java计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)

    java计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换) java 硬盘大小转换 数据转换 内存转换 存储大小转换

    二进制文件大小端转换工具,

    在计算机科学中,二进制文件大小端转换是一个重要的概念,尤其在处理跨平台数据交换时更为关键。大小端(Endian)是指在一个多字节的数据类型(如整型或浮点型)中,高字节和低字节的存储顺序。这种顺序在不同的...

    图片大小转换工具,大转小瘦身转换高质量,免安装,批量转换

    标题“图片大小转换工具,大转小瘦身转换高质量,免安装,批量转换”揭示了该工具的核心优势。首先,“大转小瘦身转换”意味着它具备将大体积的图片文件压缩成较小尺寸的能力,这对于存储空间有限或者上传速度要求高的...

    图片大小转换器

    这款工具的目的是为了帮助用户轻松地将大尺寸的图片压缩或调整为更小的尺寸,以便于网络上传、存储或者满足特定设备的显示需求。 【描述】描述中提到的"这个工具"具备用户友好的界面和简单易用的操作流程,使得即使...

    照片大小批量转换工具

    标题中的“照片大小批量转换工具”指的是一个软件应用,专门设计用于处理图片文件,特别是针对照片的尺寸调整。这类工具通常允许用户一次性处理多个照片,将它们的尺寸修改为特定的分辨率或者按照特定的需求进行缩放...

    Float类型大小端转换测试程序

    本文将深入探讨浮点数在不同字节序之间的转换,主要基于提供的“Float类型大小端转换测试程序”。 标题中的“Float类型大小端转换测试程序”是一个用于验证和实现浮点数在大端和小端系统之间转换的代码。浮点数由多...

    图片格式大小转换工具

    在IT领域,图片格式大小转换是一项常见的需求,无论是为了适应不同的设备显示,还是为了在网络上传输时节省存储空间。本文将深入探讨“图片格式大小转换工具”这一主题,包括其重要性、常见格式、转换方法以及相关的...

    TIA博途-32位浮点数大小端存储-高低字节转换全局FB库文件(4种字节排列顺序)-V17版本.zip

    在IT行业中,尤其是在嵌入式系统、网络通信和数据存储等领域,理解32位浮点数的大小端存储以及高低字节转换是非常重要的基础知识。TIA博途( Totally Integrated Automation Portal)是西门子推出的一款集成自动化...

    数字大小转换器外加源码

    但是,需要注意的是,大类型转换为小类型可能会丢失精度,而小类型转换为大类型可能不会丢失信息,但可能导致负数变为正数(如果溢出)。 4. **源码分析**:通过分析源码,初学者可以学习如何处理数字的输入、计算...

    图片格式转换 大小 调整工具

    图片格式转换和大小调整工具是为了帮助用户在不同的场景下优化图片的使用。以下将详细介绍这个主题,包括相关知识点、用途及常见方法。 图片格式转换: 1. **图片格式**:常见的图片格式有JPEG、PNG、BMP、GIF、...

    段页式存储管理地址转换

    而页式存储管理则是将内存分为固定大小的页,进程的虚拟地址空间被分割成若干页,便于物理内存的分配和管理。 段页式存储管理结合了这两种方法,它先将程序分成逻辑段,然后每个段再被分割成页。进程的虚拟地址由两...

    MSSQL行列转换存储过程

    因此,在设计存储过程时,应考虑到数据量大小和执行频率,适时优化SQL语句或采用其他高效的数据组织策略。 - **安全性和参数化**:在存储过程中使用动态SQL时,需注意SQL注入的风险。通过参数化查询,可以有效避免这...

    图片大小格式转换器下载即用

    在日常生活中,我们可能经常遇到需要将图片从一种格式转换为另一种格式,或者根据特定需求来压缩图片大小的情况,比如上传到社交媒体、邮件附件或者网络存储空间等。这款下载即用的软件无需安装,大大简化了用户的...

    汇编语言 大小写字母转换

    标题中的“汇编语言 大小写字母转换”是指在编程中使用汇编语言实现将输入的字符串中的小写字母转换为大写字母的功能。这个任务通常在处理文本输入时出现,例如用户界面或者简单的文本处理程序。描述进一步说明了这...

    TIA博途-32位浮点数大小端存储-高低字节转换的具体方法示例(4种字节排列顺序).docx

    在计算机科学中,32位浮点数...总之,理解和掌握浮点数的大小端存储以及高低字节转换在TIA博途中是至关重要的,特别是在进行跨平台或网络通信的程序设计时。通过这个FB块的示例,我们可以更直观地学习并应用这些概念。

    操作系统(模拟分页式存储管理中硬件的地址转换和产生缺页中断并用FIFO处理)

    在本主题中,我们将深入探讨操作系统中的分页式存储管理和硬件地址转换,以及当发生缺页中断时如何利用FIFO(先进先出)页面调度算法进行处理。 一、分页式存储管理 分页式存储管理是现代操作系统中广泛采用的一种...

    图片大小转换工具

    在IT领域,图片处理是日常工作中常见的任务之一,而图片大小转换工具则为这项工作提供了极大的便利。本文将深入探讨“图片大小转换工具”的相关知识点,包括其原理、实现方式以及涉及的技术。 首先,我们要理解图片...

    图片大小和格式转换.rar

    在IT领域,图片处理是一项常见的任务,涉及到的内容广泛,包括图片的大小调整和格式转换。本文将详细探讨这两个核心知识点。 首先,我们来看图片大小的调整。图片的大小通常指的是其分辨率,即图像中像素的数量。高...

    操作系统 实验 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断

    在本实验中,我们将深入探讨操作系统中的分页式虚拟存储管理,包括硬件的地址转换机制和缺页中断的处理,以及如何应用先进先出(FIFO)页面调度算法来解决这些问题。此外,我们还将实践构建一个简单的文件系统,以便...

    模拟设计动态分区存储管理中地址转换

    在操作系统领域,内存管理是核心任务之一,动态分区存储管理和地址转换是其中的关键技术。本文将深入探讨这两种方法以及它们在模拟设计中的应用。 动态分区存储管理是一种内存分配策略,主要用于多用户、多任务系统...

Global site tag (gtag.js) - Google Analytics