搞懂儲存空間

Android 4.4 之前,儲存空間:

  • 內部
    • 手機本身的內部儲存
  • 外部
    • 外插 SD card 的外部儲存

Android 4.4 之後,儲存空間:

  • 內部
    • 手機本身的內部儲存
  • 外部
    • 手機本身的外部儲存
    • 外插 SD card 的外部儲存

檢查外部儲存:

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

// 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

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存储空间
细说Android的内部存储和外部存储
彻底搞懂Android文件存储-内部存储,外部存储以及各种存储路径解惑
解析Android内部存储、外部存储的区别

tags: IO相關