可能遇到的問題
android系統自身內建有儲存,另外也可以通過sd卡來擴充儲存空間。前者好比pc中的硬碟,後者好移動硬碟。 前者空間較小,後者空間大,但後者不一定可用。 開發應用,處理本機資料存取時,可能會遇到這些問題:
基本操作儲存的用量情況
根據系統使用者不同,所能佔用的儲存空間大小也有不同
在API level 9及其以上時,File對象的getFreeSpace()方法擷取系統root使用者可用空間;
getUsableSpace()取非root使用者可用空間
當有多個儲存可用時擷取磁碟用量,根據當前系統情況選用合適的儲存。
根據系統儲存用量,合理設定app所用的空間大小;運行時,也可做動態調整。
在API level 9及其以上的系統,可直接調用File對象的相關方法,以下需自行計算:
@TargetApi(VERSION_CODES.GINGERBREAD)public static long getUsableSpace(File path) { if (path == null) { return -1; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { return path.getUsableSpace(); } else { if (!path.exists()) { return 0; } else { final StatFs stats = new StatFs(path.getPath()); return (long) stats.getBlockSize() * (long) stats.getAvailableBlocks(); } }}
路徑的規律
一般地,通過Context 和 Environment相關的方法擷取檔案存取的路徑。
通過這兩個類可擷取各種路徑,
($rootDir)+- /data -> Environment.getDataDirectory()| || | ($appDataDir)| +- data/com.srain.cube.sample| || | ($filesDir)| +- files -> Context.getFilesDir() / Context.getFileStreamPath("")| | || | +- file1 -> Context.getFileStreamPath("file1")| | ($cacheDir)| +- cache -> Context.getCacheDir()| || +- app_$name ->(Context.getDir(String name, int mode)|| ($rootDir)+- /storage/sdcard0 -> Environment.getExternalStorageDirectory() | / Environment.getExternalStoragePublicDirectory("") | +- dir1 -> Environment.getExternalStoragePublicDirectory("dir1") | | ($appDataDir) +- Andorid/data/com.srain.cube.sample | | ($filesDir) +- files -> Context.getExternalFilesDir("") | | | +- file1 -> Context.getExternalFilesDir("file1") | +- Music -> Context.getExternalFilesDir(Environment.Music); | +- Picture -> ... Environment.Picture | +- ... | | ($cacheDir) +- cache -> Context.getExternalCacheDir() | +- ???
各個路徑的特性
下面介紹這些路徑的特性以及使用中需要注意的細節:
相關代碼:
https://github.com/liaohuqiu/cube-sdk/blob/master/core/src/com/srain/cube/file/FileUtil.java