程序员都很懒,你懂的!

java程序员在实际的开发中会遇到很多的单位换算问题。今天我给大家带来的是关于计算机硬盘大小的换算。多数情况下,一般要求 b,kb,mb,gb,tb,pb之间的大小转换,我们都知道他们之间的换算是乘以1024或者除以1024。但是具体怎么用java代码来实现呢?请看 下面的代码:

 package com.herman.utils;  

 /***
* @see 存储大小(单位)转换器.
* @author Herman.Xiong
* @date 2014年5月27日 13:27:40
* @version V1.0
*/
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);
}
}

工具类代码写好了,我们来看一个测试类吧,上代码:

 package com.herman.test;  

 import com.herman.utils.SizeConverter;
/**
* @see 硬盘大小换算测试类
* @author Herman.Xiong
* @date 2014年5月27日 13:43:33
*/
public class SizeConverterTest {
public static void main(String[] args) {
System.out.println(SizeConverter.MBTrim.convert(419562f));
}
}

Java计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)的更多相关文章

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

    程序猿都非常懒.你懂的! java程序猿在实际的开发中会遇到非常多的单位换算问题.今天我给大家带来的是关于计算机硬盘大小的换算.多数情况下.一般要求b,kb,mb,gb,tb,pb之间的大小转换,我们 ...

  2. 我的Android进阶之旅------>Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换)

    Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换) 有时候要做出如下所示的展示文件大小的效果时候,需要对文件大小进行转换,然后再进行相关的代码逻辑编写. 下面是一个Java ...

  3. java B转换KB MB GB TB PB EB ZB

    public static String readableFileSize(long size) { if (size <= 0) { return "0"; } final ...

  4. 计算机存储单位KB,MB,GB,TB,PB,EB,ZB,YB后面是什么?

    关于计算机存储单位KB,MB,GB,TB,PB,EB,ZB,YB后面是什么? 我们知道Kb是1000的1次方,所以 MB就是1000的2次方(106) GB就是1000的3次方(109) TB就是10 ...

  5. Bit,Bytes,KB,MB,GB,TB,PB,EB,ZB,YB

    Bit,Bytes,KB,MB,GB,TB,PB,EB,ZB,YB 汉字字符 2字节英文字符 1字节中文标点 2字节英文标点 1字节一个字节就是一个八位二进制数啊,2就是00000010,4就是000 ...

  6. 字节b换算kb/mb/gb/tb/pb

    public static string HumanReadableFilesize(double size) { string[] units = new string[] { "B&qu ...

  7. 计算机 KB,MB,GB,TB,PB,EB 计算

    ASCII码:一个英文字母(不分大小写)占一个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数.换算为十进制,最小值-128,最大值127.如一个ASCII码就是一个字节 ...

  8. b,B,KB,MB,GB,TB,PB,EB,ZB,YB,BB,NB,DB的含义,之间的关系

    1bit=1位2进制信息 1B (byte 字节)1KB(Kilobyte 千字节)=2(10)B=1024B=2(10)B: 1MB(Megabyte 兆字节)=2(10)KB=1024KB=2(2 ...

  9. JS数据容量单位转换(kb,mb,gb,tb)

    JS代码如下: var size = '8164674'; function bytesToSize(bytes) { if (bytes === 0) return '0 B'; var k = 1 ...

随机推荐

  1. BZOJ 1395 [Baltic2005]Trip(最短路+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1354 [题目大意] 给出一些车的班次,包括起点,终点,到达起点时间区间, 到达终点时间 ...

  2. HDU 5296 Annoying problem dfs序 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Description Coco has a tree, w ...

  3. 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交

    E - 秋实大哥与家 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...

  4. Ext.js 中 25种类型的Ext.panel.Tool

    通过Ext.panel.Panel的tools配置项来设置Ext.panel.Tool实例. 要注意的一点是,Ext框架提供的Ext.panel.Tool仅包含按钮图标而具体的点击事件处理函数需要我们 ...

  5. rt-80启动tomcat

    1 #!/bin/sh 2 cd /mnt/tomcat/tomcat_8082; 3 ps -ef|grep /tomcat_8082/ |awk '{print $2}'|xargs kill - ...

  6. Unity3d面试6

    1,如何避免点击UI按钮时穿透,同时触发了相同位置场景模型的点击事件的情况?(NGUI)1,如何避免点击UI按钮时穿透,同时触发了相同位置场景模型的点击事件的情况?(NGUI 判断 是否点击到UI) ...

  7. 【docker】docker network常用命令参数

    1.帮助命令 docker network --help 2.查看docker默认三种网络 docker network ls 3.创建自定义网络,如果不指定,默认创建类型为bridge类型 dock ...

  8. 【jQuery】remove()和empty()的使用

    在项目需求中 ,会涉及,为select下拉框中重新填充或追加新的下拉项. 这样的话 之前的下拉项就需要清除掉. 有了这个需求,就需要我们注意到remove()和empty()的区别在哪里: empty ...

  9. Workflow:采用坐标变换(移动和旋转)画箭头

    背景 流程设计器的连线部分需要画一个箭头代表连接的方向,下图是期望的效果: 刚开始我准备采用三角函数(sin和cos)来计算三角的坐标,实现的过程真不爽(有兴趣的朋友可以试试),就在完工的时候,突然想 ...

  10. Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...