java 计算文件或目录大小

package com.io;

/**

* 此类用于获得文件或者目录大小

* FileSize.toString()以KB,MB,GB形式返回字符串

* getLongSize()以字节形式返回文件或者目录大小

* 关键方法

* File.length返回文件的字节

* author:yehaizi

*/
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
public class FileSize {

//bt字节参考量
public static final long SIZE_BT=1024L;
//KB字节参考量
public static final long SIZE_KB=SIZE_BT*1024L;
//MB字节参考量
public static final long SIZE_MB=SIZE_KB*1024L;
//GB字节参考量
public static final long SIZE_GB=SIZE_MB*1024L;
//TB字节参考量
public static final long SIZE_TB=SIZE_GB*1024L;

public static final int SACLE=2;

//文件属性
private File file;
//文件大小属性
private long longSize;

public FileSize(File file)
{
   this.file=file;
}

//返回文件大小
private void getFileSize()throws RuntimeException,IOException
{
   //初始化文件大小为0;
   this.longSize=0;
  
   //如果文件存在而且是文件,直接返回文件大小
   if(file.exists()&&file.isFile())
   {
    this.longSize= file.length();
   
   //文件存在而且是目录,递归遍历文件目录计算文件大小 
   }else if(file.exists()&&file.isDirectory())
   {
    getFileSize(file);//递归遍历
   }else
   {
    throw new RuntimeException("指定文件不存在");
   }
}

//递归遍历文件目录计算文件大小
private void getFileSize(File file)throws RuntimeException,IOException
{
   //获得文件目录下文件对象数组
   File[] fileArray=file.listFiles();
   //如果文件目录数组不为空或者length!=0,即目录为空目录
   if(fileArray!=null&&fileArray.length!=0)
   {
    //遍历文件对象数组
    for(int i=0;i<fileArray.length;i++)
    {
     File fileSI=fileArray[i];
     //如果是目录递归遍历
     if(fileSI.isDirectory())
     {
      //递归遍历
      getFileSize(fileSI);
     }
     //如果是文件
     if(fileSI.isFile())
     {
      this.longSize+=fileSI.length();
     }
    }
   }else
   {
    //如果文件目录数组为空或者length==0,即目录为空目录
    this.longSize=0;
   }
}

public String toString()throws RuntimeException
{
   try
   {
    //调用计算文件或目录大小方法
    getFileSize();
   
    if(this.longSize>=0&&this.longSize<SIZE_BT)
    {
     return this.longSize+"B";
    }else if(this.longSize>=SIZE_BT&&this.longSize<SIZE_KB)
    {
     return this.longSize/SIZE_BT+"KB";
    }else if(this.longSize>=SIZE_KB&&this.longSize<SIZE_MB)
    {
     return this.longSize/SIZE_KB+"MB";
    }else if(this.longSize>=SIZE_MB&&this.longSize<SIZE_GB)
    {
     BigDecimal longs=new BigDecimal(Double.valueOf(this.longSize+"").toString());
     BigDecimal sizeMB=new BigDecimal(Double.valueOf(SIZE_MB+"").toString());
     String result=longs.divide(sizeMB, SACLE,BigDecimal.ROUND_HALF_UP).toString();
     //double result=this.longSize/(double)SIZE_MB;
     return result+"GB";
    }else
    {
     BigDecimal longs=new BigDecimal(Double.valueOf(this.longSize+"").toString());
     BigDecimal sizeMB=new BigDecimal(Double.valueOf(SIZE_GB+"").toString());
     String result=longs.divide(sizeMB, SACLE,BigDecimal.ROUND_HALF_UP).toString();
     return result+"TB";
    }   
   }
   catch(IOException ex)
   {
    ex.printStackTrace();
    throw new RuntimeException(ex.getMessage());
   }
}
 


public File getFile() {
   return file;
}

public void setFile(File file) {
   this.file = file;
}

public long getLongSize()throws RuntimeException {
   try
   {
    //调用计算文件或目录大小方法
    getFileSize();
    return longSize;  
   }
   catch(IOException ex)
   {
    ex.printStackTrace();
    throw new RuntimeException(ex.getMessage());
   }
}


}

转载于:https://my.oschina.net/wind2015/blog/1517646

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值