内部存储
作用
保存应用私有文件
可见性
本应用可见,其他应用无法访问
生命周期
应用卸载时被删除
权限
不需要任何用户权限
代码实现
- 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/Music
File externalStoragePublicDirectoryDownloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
//··· 等等
- 私有目录
媒体扫描器不会扫描这些目录,并且应用卸载时这些目录会被删除
//应用外部缓存目录
//位置 /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);
//··· 等等
网友评论