Android获取外部和内部存储空间总大小和可用大小

android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等。

      看下读取sd卡的:

Java代码   收藏代码
  1. void readSDCard() {  
  2.         String state = Environment.getExternalStorageState();  
  3.         if(Environment.MEDIA_MOUNTED.equals(state)) {  
  4.             File sdcardDir = Environment.getExternalStorageDirectory();  
  5.             StatFs sf = new StatFs(sdcardDir.getPath());  
  6.             long blockSize = sf.getBlockSize();  
  7.             long blockCount = sf.getBlockCount();  
  8.             long availCount = sf.getAvailableBlocks();  
  9.             Log.d("""block大小:"+ blockSize+",block数目:"+ blockCount+",总大小:"+blockSize*blockCount/1024+"KB");  
  10.             Log.d("""可用的block数目::"+ availCount+",剩余空间:"+ availCount*blockSize/1024+"KB");  
  11.         }     
  12.     }  

       然后看下读取系统内部空间的:

Java代码   收藏代码
  1. void readSystem() {  
  2.         File root = Environment.getRootDirectory();  
  3.         StatFs sf = new StatFs(root.getPath());  
  4.         long blockSize = sf.getBlockSize();  
  5.         long blockCount = sf.getBlockCount();  
  6.         long availCount = sf.getAvailableBlocks();  
  7.         Log.d("""block大小:"+ blockSize+",block数目:"+ blockCount+",总大小:"+blockSize*blockCount/1024+"KB");  
  8.         Log.d("""可用的block数目::"+ availCount+",可用大小:"+ availCount*blockSize/1024+"KB");  
  9.     }  

       StatFs获取的都是以block为单位的,这里我解释一下block的概念:

1.硬件上的 block size, 应该是"sector size",linux的扇区大小是512byte
2.有文件系统的分区的block size, 是"block size",大小不一,可以用工具查看
3.没有文件系统的分区的block size,也叫“block size”,大小指的是1024 byte
4.Kernel buffer cache 的block size, 就是"block size",大部分PC是1024
5.磁盘分区的"cylinder size",用fdisk 可以查看。

      我们这里的block size是第二种情况,一般SD卡都是fat32的文件系统,block size是4096.

      这样就可以知道手机的内部存储空间和sd卡存储空间的总大小和可用大小了。


获取手机存储空间值 private String getInternalMemoryPath() { return Environment.getDataDirectory().getPath(); } /** * * @return 内置sd卡路径 */ private String getExternalMemoryPath() { // return Environment.getExternalStorageDirectory().getPath(); return "/mnt/sdcard"; } /** * * @return 外置sd卡路径 */ private String getSDCard2MemoryPath() { return "/mnt/sdcard1"; } /** * * @param path * 文件路径 * @return 文件路径的StatFs对象 * @throws Exception * 路径为空或非法异常抛出 */ private StatFs getStatFs(String path) { try { return new StatFs(path); } catch (Exception e) { e.printStackTrace(); } return null; } /** * * @param stat * 文件StatFs对象 * @return 剩余存储空间的MB数 * */ private float calculateSizeInMB(StatFs stat) { if (stat != null) return stat.getAvailableBlocks() * (stat.getBlockSize() / (1024f * 1024f)); return 0.0f; } /** * * @return ROM剩余存储空间的MB数 */ private float getAvailableInternalMemorySize() { String path = getInternalMemoryPath();// 获取数据目录 StatFs stat = getStatFs(path); return calculateSizeInMB(stat); } /** * * @return 内置SDCard剩余存储空间MB数 */ private float getAvailableExternalMemorySize() { String path = getExternalMemoryPath();// 获取数据目录 StatFs stat = getStatFs(path); return calculateSizeInMB(stat); } /** * * @return 外置SDCard剩余存储空间MB数 */ private float getAvailableSDCard2MemorySize() { // String status = Environment.getExternalStorageState(); // if (status.equals(Environment.MEDIA_MOUNTED)) { // } String path = getSDCard2MemoryPath(); // 获取数据目录 StatFs stat = getStatFs(path); return calculateSizeInMB(stat); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值