内部存储
每个安装的app,系统都会在内部存储空间的data/data目录下以包名为名字自动创建与之对应的文件夹,用于存储SharePreferences和SQLiteDatabase持久化数据。内部存储就是app,自己的存储空间,默认情况下,只能被App自身访问。
Android SDK提供可以获取内部存储空间的目录文件方法:
方法 | 作用 | 备注 |
---|---|---|
getFilesDir() | 获取内部存储的文件目录 | |
getCacheDir() | 获取内部存储的缓存目录 | |
getDir() | 和前两个一样,区别在于文件夹名可以自定,访问权限也可以自定 |
/**
* @param name就是文件夹名 经过测试 生成的文件夹名 带有app_ 前缀
* @param mode 操作模式。值可以是0或MODE_PRIVATE,MODE_WORLD_READABLE
MODE_WORLD_WRITEABLE,和MODE_APPEND
* @return File对象
*/
public abstract File getDir(String name,int mode)
卸载用户时,系统会删除data/data/包名 文件夹
具体使用方法
使用context调用以上方法
MainActivity.this.getCacheDir();
MainActivity.this.getFilesDir();
外部存储
内部存储的空间实际上非常小,因此不建议将文件存放在内部存储中。因此,android在外部存储空间中也为程序提供了一个特殊目录存放私有文件。
/storage/emulated/0/Android/data/app package name
注意:
- android 7.0开始,其他app无法通过file://这种形式直接读写该目录下的文件内容,需要通过FileProvider访问
android sdk 提供的针对外部存储的方法
方法 | 作用 | 备注 |
---|---|---|
getExternalFilesDir() | 获取外部存储的文件目录 | |
getExternalCacheDir() | 获取外部存储的缓存目录 |
同样的,卸载软件此目录也会被删除
外部存储的公共目录
如果你不想你的数据在程序卸载的时候被删除,那么就得使用这里的知识点了。
首先记得:使用公共目录一定要申请外部存储访问权限。
外部存储空间具有一些默认的公共目录,可以通过Environment类提供的方法传入不同的type参数获取绝对目录。
Enviroment.getExternalStoragePublicDirectory(String type);
Enviroment提供的类型
具体使用方法
MainActivity.this.getExternalCacheDir();
MainActivity.this.getExternalFilesDir("");
注意
Enviroment.getExternalStoragePublicDirectory() 在api29中被废除了为了提高用户隐私,不推荐直接访问共享/外部存储设备。在android Q中,应用程序将无法再直接访问此方法返回的路径。可以使用其他方式来替代,如访问存储在共享/外部存储内容 Context#getExternalFilesDir(String), MediaStore或Intent#ACTION_OPEN_DOCUMENT。
实例:
Log.i(TAG, "onCreate: "+this.getExternalFilesDir(Environment.DIRECTORY_MOVIES));
总结
内外存储说明图
Context、Enviroment
这两个类都可以获得文件夹路径
但是Context可以获取带有包名的文件夹路径而Enviroment可以获取不带包名的路径
返回值
以上方法返回的File对象