Android中的五种存储方式和各自的特点
一:简介
内置硬盘:需要自己控制内置硬盘缓存文件
外置硬盘:手机共享的文件,例如照片
Shared preferences:以键值对的方式保存私有的数据,存储简单的键值对xml,可以存储boolen float int long string类型
Database:保存有规模的私有数据库,推荐使用Room persistence library
除了硬盘的数据,其他的方式都是为了存储私有的数据,ContentProvider可以用来控制数据的权限.
二.具体内容
1.硬盘
1).内置硬盘和外置硬盘的区别:
内置硬盘:一直都是存在的,文件只能被当前的app获取,卸载APP的时候会删除
外置硬盘:不一定一直是存在的,共享读取的,如果使用getExternalFilesDir() 获取存储路径卸载APP的时候会顺带删除
APP的安装路径默认是内置硬盘,但是也可以指定到外置硬盘,通过在manifest 文件中指定Android:installLocation
2).内置硬盘:
在内置硬盘中保存文件的路径是由app的包名决定的,而且保存在Android文 件系统中一个特定的位置.
getFilesDir():获取app内置硬盘的一个路径
getCacheDir():获取暂存文件路径,需要控制在不需要的时候删除给定的 文件,并且创建文件的时候一定要制定一个size限度.
创建文件的时候,可以使用File()构造函数,新建一个file,指定路径和名称.
File file = new File(this.getFilesDir(),filename);
也可以使用openFileOutput()方法打开一个输出流,从app中输出文件到指定 的路径并规定文件名,这个方法自动输出到内置硬盘的app路径,这一点可 以从Context.java类以及中看出.返回的是当前Context的路径.
String fileName=”text.txt”;
String fileContent=”Hello World!”;
FileOutPutStream fos;
try{
fos = openOutPut(fileName,Context.MODE_PRIVATE);
fos.write(fileContent.getBytes());
fos.close();
}catch(Exception e){
e.printStrackTrace();
}
注意此处的在7.0以上的版本中不存在Context.MODE_PRIVATE之外的 其他权限了.
内置硬盘缓存文件:
通过createTempFile()创建
public void setTempFile(Context context, String uri){
File file;
try{
String fileName = uri.parse(url).getLastPathSegment();
file = File.createTempFile(filename,null,context.getCacheDir());
}catch(Exception e){
e.printStackTrace();
}
}
在读取临时文件前需要检测是否存在,存储空间不足时会自动删除临时文件.并 且在使用过后应当立即删除.
打开文件:
openFileInput(name);在APP安装的时候就可见的文件可以存放在 res/raw/当中.
getFileDir()/getDir(name,mode)/getCacheDir():都是在当前app的路径 下进行的路径的相关操作
3).外置硬盘
外部硬盘:
在外部硬盘存放文件需要两个准备:
1. 请求权限
2. 确认存储区域是可用的
Android4.4以及更高不需要读写权限,以下的需要权限,需要在Manifest文件 中获取权限后加上最高sdk的属性
<user-permission android:name=”......”
android:maxSdkVersion=”18”/>
确认可用:
if(Environment.getExternalStorage().equals(Environment.MEDIA _MOUNTED);
保存文件到公共路径:
使用getExternalStoragePublicDirectory(),这个方法需要指定保存文件 的类型.
File file = new File(Environment.getExternalStoragePublicDirectory(Environmen t.TYPE),fimeName);
使用隐藏文件”.name”,可以避免被找到.
保存到私有路径:
getExternalFilesDir()
选择多重的存储位置
API19 getExternalFilesDirs();
ContextCompat.getExternalFilesDirs();
查询空闲的空间:
getFreeSpace()/getTotalSpace().
删除文件:
delete();
-----------------------------未完-------------------------------