本文沒有多餘的廢話
內部存儲
作用
保存應用私有文件
可見性
本應用可見,其他應用無法訪問
生命週期
應用卸載時被刪除
權限
不需要任何用戶權限
代碼實現
- IO流
//文件存儲位置 data/data/[packagename]/files/
//手機設置-應用管理-刪除應用數據 該操作會刪除此類文件(即刪除files文件夾)
//上述操作同樣會刪除data/data/[packagename]/下database,shared_prefs,cache等文件夾
try{
FileOutputStream output = context.openFileOutput("inner.txt", Context.MODE_PRIVATE);
utput.write("vbb".getBytes());
output.flush();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
if(output != null){
output.close();
}
}
- 靜態資源 res/raw 文件夾下數據
InputStream fis=null;
try {
fis=getResources().openRawResource(R.raw.[rawfileName]);
BufferedReader bf=new BufferedReader(new InputStreamReader(fis));
StringBuilder builder=new StringBuilder();
String line=null;
while((line=bf.readLine())!=null){
builder.append(line);
}
Log.i(TAG,"已讀取Raw數據:"+builder.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//關閉資源
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 緩存數據
//文件存儲位置 data/data/[packagename]/cache/
//手機設置-應用管理-清除應用緩存 該操作會刪除此類文件(即刪除cache文件夾)
File cacheDir = context.getCacheDir();
mTvFile.append("1. context.getCacheDir() = "+cacheDir.getAbsolutePath());
mTvFile.append("\n");
File cache = new File(cacheDir.getAbsolutePath() + File.separator + "cache.txt");
if (!cache.exists()){
cache.createNewFile();
mTvFile.append("1.1 context.getCacheDir() = "+cache.getAbsolutePath());
mTvFile.append("\n");
}else {
mTvFile.append("1.1 context.getCacheDir() = "+cache.getAbsolutePath());
mTvFile.append("\n");
}
注意
- 應用的私有緩存文件不應該過大。如果內存存儲空間不足,系統可能會刪除這些緩存文件。
外部存儲
概念
外部存儲是相對於內部存儲的概念。
作用
保存全局範圍的可讀取的文件。
可見性
設備中任何應用訪問,也可以被用戶查看,修改
生命週期
- 私有文件 應用卸載時會被刪除
- 公共文件 應用卸載時不會被刪除,直到用戶手動刪除
權限
需要申請權限。READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE。
涉及Android6.0運行時權限。
代碼實現
公共文件存儲
- 外部存儲可用性檢查
//Environment的靜態字符串常量共 10 種
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.d("environment-state","外部存儲可用");
}else {
Log.d("environment-state","外部存儲不可用");
}
- 公共目錄
//外部存儲根目錄
//位置 /storage/emulated/0
File externalStorageDirectory = Environment.getExternalStorageDirectory();
//Download 下載目錄
//位置 /storage/emulated/0/Download
File externalStoragePublicDirectoryDownloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
//Music 音樂目錄
//位置 /storage/emulated/0/Music
File externalStoragePublicDirectoryDownloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
//DCIM 圖片目錄
//位置 /storage/emulated/0/DCIM
File externalStoragePublicDirectoryDownloads = Environment.getExternalStoragePublicDirectory(Environment.DCIM);
//··· 等等
- 私有目錄
媒體掃描器不會掃描這些目錄,並且應用卸載時這些目錄會被刪除
//應用外部緩存目錄
//位置 /storage/emulated/0/Android/data/[pacagename]/cache/
File externalCacheDir = context.getExternalCacheDir();
//注意 外部存儲可能同時包含內置存儲器和SD卡兩個存儲空間,因此在Android 4.4(API 19)及以上還可以通過Context的getExternalCacheDirs方法訪問這兩個存儲空間。
//第一個數組對象 爲外部主存儲器器的緩存目錄即context.getExternalCacheDir()的返回值
//第二個數組對象 爲sd卡的緩存目錄
File[] externalCacheDirs = context.getExternalCacheDirs();
//應用外部文件目錄
//Download 下載目錄
//位置 /storage/emulated/0/Android/data/[pacagename]/files/Download/
File externalFilesDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
//Music 音樂目錄
//位置 /storage/emulated/0/Android/data/[pacagename]/files/Music/
File externalFilesDir = context.getExternalFilesDir(Environment.MUSIC);
//··· 等等