java,php,asp.net,linux,javascript,mysql,mssql,oracle,编程

转换文件大小

转载请注明:http://www.pmjava.com/Article/ShowInfo.asp?ID=56613
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;

     *         若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));
        }
    }

}

posted on 2009-06-10 21:43 rrong_m 阅读(523) 评论(0)  编辑  收藏

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

随笔档案

文章分类

文章档案

java编程

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜