搞懂儲存空間 === Android 4.4 之前,儲存空間: - 內部 - 手機本身的內部儲存 - 外部 - 外插 SD card 的外部儲存 Android 4.4 之後,儲存空間: - 內部 - 手機本身的內部儲存 - 外部 - 手機本身的外部儲存 - 外插 SD card 的外部儲存 --- 檢查外部儲存: ```java= if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { files = getExternalFilesDirs(Environment.MEDIA_MOUNTED); for (File file : files) { logger.error("main " + String.valueOf(file)); } } ``` 輸出 ``` 手機本身的外部儲存 /storage/emulated/0/Android/data/packname/files/mounted 外插 SD card 的外部儲存 /storage/B3E4-1711/Android/data/packname/files/mounted ``` --- `/data` 開頭的目錄,為內部儲存 `/storage` 開頭的目錄,為外部儲存 `/system` 開頭的目錄,存放系統文件;`Environment.getRootDirectory()`取得 `/cache` 開頭的目錄,存放暫存文件;`Environment.getDownloadCacheDirectory()`取得 --- 此處的 `Environment` 為內建 static method,用於檔案路徑、目錄的檢查與存取 --- Example ```java= // Android 系統的數據目錄 Environment.getDataDirectory().getPath(): // /data // Android 系統的根目錄 Environment.getRootDirectory().getPath(): // /system Environment.getStorageDirectory().getPath(): // /storage // 系統下載快取目錄 Environment.getDownloadCacheDirectory().getPath(): // /data/cache // 外部儲存設備上的公共儲存目錄(如音樂、照片等) Environment.getExternalStoragePublicDirectory("").getPath(): // /storage/emulated/0 // // /storage/emulated/Music // // /storage/emulated/Pictures // // /storage/emulated/Download // // /storage/emulated/DCIM // // ... (可在手機的“檔案管理”實際看到這些對應的目錄) // 外部儲存設備的根目錄 Environment.getExternalStorageDirectory().getPath(): // /storage/emulated/0 // // /storage/emulated/Music // // /storage/emulated/Pictures // // /storage/emulated/Download // // /storage/emulated/DCIM // // ... (可在手機的“檔案管理”實際看到這些對應的目錄) // 應用程式的內部儲存目錄 getFilesDir().getPath(): // /data/user/0/com.maxkit.msicloud_android/files // 應用程式的內部快取目錄 getCacheDir().getPath(): // /data/user/0/com.maxkit.msicloud_android/cache // 應用程式的數據目錄 getDataDir().getPath(): // /data/user/0/com.maxkit.msicloud_android // 取應用程式的外部快取目錄 getExternalCacheDir().getPath(): // /storage/emulated/0/Android/data/com.maxkit.msicloud_android/cache // 應用程式的代碼快取目錄。應用程式的編譯代碼和優化的快取文件,通常不需要直接操作這個目錄。它是由 Android 系統管理 getCodeCacheDir().getPath(): // /data/user/0/com.maxkit.msicloud_android/code_cache getExternalFilesDir(""): // /storage/emulated/0/Android/data/com.maxkit.msicloud_android/files/mounted // /storage/emulated/0/Android/data/com.maxkit.msicloud_android/files/shared_prefs // 應用程式的外部檔案目錄 getExternalFilesDirs(""): // /storage/emulated/0/Android/data/com.maxkit.msicloud_android/files // 應用程式的外部快取目錄 getExternalCacheDirs(): // /storage/emulated/0/Android/data/com.maxkit.msicloud_android/cache // 應用程式的外部媒體目錄列表 getExternalMediaDirs(): // /storage/emulated/0/Android/media/com.maxkit.msicloud_android ``` --- ```java= public static long getInternalTotalMemorySize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSizeLong(); long totalBlocks = stat.getBlockCountLong(); return totalBlocks * blockSize; } public static long getInternalAvailableMemorySize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSizeLong(); long availableBlocks = stat.getAvailableBlocksLong(); return availableBlocks * blockSize; } public static boolean isSDCardEnable() { return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } public static long getExternalTotalMemorySize() { if (!isSDCardEnable()) { return -1; } File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSizeLong(); long totalBlocks = stat.getBlockCountLong(); return totalBlocks * blockSize; } public static long getExternalAvailableMemorySize() { if (!isSDCardEnable()) { return -1; } StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); long blockSize, availableBlocks; availableBlocks = stat.getAvailableBlocksLong(); blockSize = stat.getBlockSizeLong(); return availableBlocks * blockSize; } public static void showCapacity() { long internal_total_size = getInternalTotalMemorySize(); long internal_avl_size = getInternalAvailableMemorySize(); long external_total_size = getExternalTotalMemorySize(); long external_avl_size = getExternalAvailableMemorySize(); logger.debug( "內部總共: " + internal_total_size + " (" + FileUtils.convertUnit(internal_total_size, FileUtils.SizeUnit_Auto) + "), " + "內部剩餘: " + internal_avl_size + " (" + FileUtils.convertUnit(internal_avl_size, FileUtils.SizeUnit_Auto) + "), " + "外部總共: " + external_total_size + " (" + FileUtils.convertUnit(external_total_size, FileUtils.SizeUnit_Auto) + "), " + "外部剩餘: " + external_avl_size + " (" + FileUtils.convertUnit(external_avl_size, FileUtils.SizeUnit_Auto) + ")" ); } ``` ## Ref. [Android之获取手机内部及sdcard存储空间](https://blog.csdn.net/qq_16628781/article/details/69181942) [细说Android的内部存储和外部存储](https://blog.csdn.net/huxin1875/article/details/87735729) [彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑](https://blog.csdn.net/s13383754499/article/details/82910704) [解析Android内部存储、外部存储的区别](https://blog.csdn.net/baidu_36385172/article/details/79695308?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control) ###### tags: `IO相關`