android 获取存储空间大小

android手机上面的存储空间主要有手机本身的存储空间和SD卡的存储空间。之前用的最多的是SD卡的存储空间,在总结的时候看了一下系统的源代码,很有收获。在手机安装应用时,系统会自动在/data/data目录下面以应用的主包名创建一个目录,默认还会在最后的那个目录里面创建一个lib目录。下面看一下获取存储空间的代码:

  1. import android.os.Environment;  
  2. import android.os.StatFs;  
  3.   
  4. /** 
  5.  * 存储空间管理 
  6.  * 
  7.  */  
  8. public class MemorySpaceCheck  
  9. {  
  10.       
  11.     /** 
  12.      * 计算剩余空间 
  13.      * @param path 
  14.      * @return 
  15.      */  
  16.     private static long getAvailableSize(String path)  
  17.     {  
  18.         StatFs fileStats = new StatFs(path);  
  19.         fileStats.restat(path);  
  20.         return (long) fileStats.getAvailableBlocks() * fileStats.getBlockSize(); // 注意与fileStats.getFreeBlocks()的区别  
  21.     }  
  22.       
  23.     /** 
  24.      * 计算总空间 
  25.      * @param path 
  26.      * @return 
  27.      */  
  28.     private static long getTotalSize(String path)  
  29.     {  
  30.         StatFs fileStats = new StatFs(path);  
  31.         fileStats.restat(path);  
  32.         return (long) fileStats.getBlockCount() * fileStats.getBlockSize();  
  33.     }  
  34.       
  35.     /** 
  36.      * 计算SD卡的剩余空间 
  37.      * @return 剩余空间 
  38.      */  
  39.     public static long getSDAvailableSize()  
  40.     {  
  41.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
  42.         {  
  43.             return getAvailableSize(Environment.getExternalStorageDirectory().toString());  
  44.         }  
  45.           
  46.         return 0;  
  47.     }  
  48.       
  49.     /** 
  50.      * 计算系统的剩余空间 
  51.      * @return 剩余空间 
  52.      */  
  53.     public static long getSystemAvailableSize()  
  54.     {  
  55.         // context.getFilesDir().getAbsolutePath();  
  56.         return getAvailableSize("/data");  
  57.     }  
  58.       
  59.     /** 
  60.      * 是否有足够的空间 
  61.      * @param filePath 文件路径,不是目录的路径 
  62.      * @return 
  63.      */  
  64.     public static boolean hasEnoughMemory(String filePath)  
  65.     {  
  66.         File file = new File(filePath);  
  67.         long length = file.length();  
  68.         if (filePath.startsWith("/sdcard") || filePath.startsWith("/mnt/sdcard"))  
  69.         {  
  70.             return getSDAvailableSize() > length;  
  71.         }  
  72.         else  
  73.         {  
  74.             return getSystemAvailableSize() > length;  
  75.         }  
  76.           
  77.     }  
  78.       
  79.     /** 
  80.      * 获取SD卡的总空间 
  81.      * @return 
  82.      */  
  83.     public static long getSDTotalSize()  
  84.     {  
  85.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
  86.         {  
  87.             return getTotalSize(Environment.getExternalStorageDirectory().toString());  
  88.         }  
  89.           
  90.         return 0;  
  91.     }  
  92.       
  93.     /** 
  94.      * 获取系统可读写的总空间 
  95.      * @return 
  96.      */  
  97.     public static long getSysTotalSize()  
  98.     {  
  99.         return getTotalSize("/data");  
  100.     }  
  101. }  
  102. 如果想要在系统的存储空间中写入数据,可以用context.getFilesDir().getAbsolutePath(),获取该应用的可写目录,也就是/data/data/应用主包名/files目录,可以往里面写入数据,在应用被卸载时,也一并被删除,不用担心会产生垃圾,非常给力。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值