作為一個(gè)開發(fā)者,我們經(jīng)常需要通過緩存一些文件到SD卡中,常見的方式就是,通過:
File sdCard = Environment.getExternalStorageDirectory();
獲取SD卡根目錄,然后自定義文件/文件名進(jìn)行文件存儲(chǔ).這樣做法的結(jié)果就是,當(dāng)手機(jī)安裝了大量的app時(shí)昂芜,
SD卡根目錄會(huì)迅速變得雜亂不堪莹规。并且在API 6.0之后,根目錄文件存儲(chǔ)是需要用戶授權(quán)的,就算你在
AndroidManifest.xml中配置了存儲(chǔ)權(quán)限,用戶不授權(quán)也是寫不進(jìn)去了.
SD卡讀寫權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
其實(shí),Google已經(jīng)提供了最佳的外部存儲(chǔ)方案,那就是統(tǒng)一路徑為:
/Android/data/< package name >/files/… (該路徑通常掛載在/mnt/sdcard/下)
外部存儲(chǔ)路徑調(diào)用方法是:context.getExternalFilesDir(dir).getAbsolutePath() //通過context調(diào)用,
參數(shù)dir為自自定義文件夾.
這個(gè)方法獲得的文件存儲(chǔ)路徑適用于6.0以后系統(tǒng),主要AndroidManifest.xml配置讀寫權(quán)限了,
就不需要用戶再授權(quán)了.
以上,是關(guān)于外部存儲(chǔ)的介紹,那么如果有些手機(jī)沒有SD卡或者系統(tǒng)自身沒有分配外部存儲(chǔ)空間,時(shí),
我們應(yīng)該怎么緩存數(shù)據(jù)呢?
那就需要用到內(nèi)部存儲(chǔ)了,內(nèi)部存儲(chǔ)的路徑是: /data/data/< package name >/files/…
(該路徑掛載在在手機(jī)自身存儲(chǔ)目錄)
內(nèi)部存儲(chǔ)路徑調(diào)用方法是:context().getCacheDir().getAbsolutePath() //通過context調(diào)用
因此,正常開發(fā)中獲取存儲(chǔ)路徑的方法是:
/**
- @param context 上下文對(duì)象
- @param dir 存儲(chǔ)目錄
- @return
*/
public static String getFilePath(Context context,String dir) {
String directoryPath="";
//判斷SD卡是否可用
if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {
directoryPath =context.getExternalFilesDir(dir).getAbsolutePath() ;
// directoryPath =context.getExternalCacheDir().getAbsolutePath() ;
}else{
//沒內(nèi)存卡就存機(jī)身內(nèi)存
directoryPath=context.getFilesDir()+File.separator+dir;
// directoryPath=context.getCacheDir()+File.separator+dir;
}
File file = new File(directoryPath);
if(!file.exists()){//判斷文件目錄是否存在
file.mkdirs();
}
LogUtil.i("filePath====>"+directoryPath);
return directoryPath;
}
其中,getExternalCacheDir()與getCacheDir()的區(qū)別 與getExternalFilesDir()及getFilesDir()的區(qū)別相同,
前者只是在路徑下自動(dòng)建好了一個(gè)cach文件目錄:/data/< package name >/files/cach/...
存儲(chǔ)區(qū)別簡(jiǎn)明示意圖如下:
<colgroup style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;"><col width="157" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;"><col width="270" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;"><col width="362" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;"></colgroup>
| 區(qū)別 | 方法 | 備注 |
| external storage
外部存儲(chǔ) | Environment.getExternalStorageDirectory() | SD根目錄:/mnt/sdcard/ (6.0后寫入需要用戶授權(quán)) |
| context.getExternalFilesDir(dir) | 路徑為:/mnt/sdcard/Android/data/< package name >/files/… |
| context.getExternalCacheDir() | 路徑為:/mnt/sdcard//Android/data/< package name >/cach/… |
| internal storage
內(nèi)部存儲(chǔ) | context.getFilesDir() | 路徑是:/data/data/< package name >/files/… |
| context.getCacheDir() | 路徑是:/data/data/< package name >/cach/… |
以上,就是本文全部?jī)?nèi)容,如有錯(cuò)誤和描述不當(dāng)歡迎大家指正,謝謝!