android手机上面的存储空间主要有手机本身的存储空间和SD卡的存储空间。之前用的最多的是SD卡的存储空间,在总结的时候看了一下系统的源代码,很有收获。在手机安装应用时,系统会自动在/data/data目录下面以应用的主包名创建一个目录,默认还会在最后的那个目录里面创建一个lib目录。下面看一下获取存储空间的代码:
- import android.os.Environment;
- import android.os.StatFs;
- /**
- * 存储空间管理
- *
- */
- public class MemorySpaceCheck
- {
- /**
- * 计算剩余空间
- * @param path
- * @return
- */
- private static long getAvailableSize(String path)
- {
- StatFs fileStats = new StatFs(path);
- fileStats.restat(path);
- return (long) fileStats.getAvailableBlocks() * fileStats.getBlockSize(); // 注意与fileStats.getFreeBlocks()的区别
- }
- /**
- * 计算总空间
- * @param path
- * @return
- */
- private static long getTotalSize(String path)
- {
- StatFs fileStats = new StatFs(path);
- fileStats.restat(path);
- return (long) fileStats.getBlockCount() * fileStats.getBlockSize();
- }
- /**
- * 计算SD卡的剩余空间
- * @return 剩余空间
- */
- public static long getSDAvailableSize()
- {
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
- {
- return getAvailableSize(Environment.getExternalStorageDirectory().toString());
- }
- return 0;
- }
- /**
- * 计算系统的剩余空间
- * @return 剩余空间
- */
- public static long getSystemAvailableSize()
- {
- // context.getFilesDir().getAbsolutePath();
- return getAvailableSize("/data");
- }
- /**
- * 是否有足够的空间
- * @param filePath 文件路径,不是目录的路径
- * @return
- */
- public static boolean hasEnoughMemory(String filePath)
- {
- File file = new File(filePath);
- long length = file.length();
- if (filePath.startsWith("/sdcard") || filePath.startsWith("/mnt/sdcard"))
- {
- return getSDAvailableSize() > length;
- }
- else
- {
- return getSystemAvailableSize() > length;
- }
- }
- /**
- * 获取SD卡的总空间
- * @return
- */
- public static long getSDTotalSize()
- {
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
- {
- return getTotalSize(Environment.getExternalStorageDirectory().toString());
- }
- return 0;
- }
- /**
- * 获取系统可读写的总空间
- * @return
- */
- public static long getSysTotalSize()
- {
- return getTotalSize("/data");
- }
- }
- 如果想要在系统的存储空间中写入数据,可以用context.getFilesDir().getAbsolutePath(),获取该应用的可写目录,也就是/data/data/应用主包名/files目录,可以往里面写入数据,在应用被卸载时,也一并被删除,不用担心会产生垃圾,非常给力。