在开发中一般会对手机的内存进行操作,比如在使用应用过程中产生的一些日志、图片等信息,我们有时候要对其进行必要的操作,所以要对文件这一块要有一个基础的理解。
概念
1、内部存储:
首先说明一个概念,内部存储不是内存,而是像磁盘一样可以存储数据的地方,他在手机内部,属于手机自带内存的一部分。
内部存储私有目录
里面有一个 data/data 文件夹,下面存放是所有应用程序的包名文件夹,这部分的内容只有在手机 root 之后才能看得到,如果使用的是模拟器,可以在 Android Device Monitor
中看到。
比如一个应用的包名为 com.test.test
那么这个应用只能访问 /data/data/com.test.test
目录下面的文件,其他 data/data
目录下面的文件这个应用是访问不到的
方法:
* Environment.getDataDirectory();
获取data根目录
getFilesDir()
方法用于获取/data/data/<application package>/files
目录getCacheDir()
方法用于获取/data/data/<application package>/cache
目录deleteFile()
删除文件fileList()
列出所有文件
注意:当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。
2、外部存储
这里不要被外部存储几个字所迷惑,这里说的外部存储其实不单单指的外置的内存卡, Android 手机在出厂的时候的内存,比如平常我们所说的 64G 、128G 内存,这个部分就是我们开发人员所说的外部存储。
那我们往手机里面插入的内存卡叫什么呢?
对的,也是叫外部存储。
在参考文章看到一句话:只要是能看得到,都是外部存储。
外部存储私有目录
备注:一般设备都有内置 SD 卡,同时也提供外部 SD 卡拓展,可能对应路径的目录名有所差异。
如果没有插入内存卡的话,一般外部存储的私有目录就是:
/storage/emulated/0/Android/data/app package name
方法:
* Environment.getExternalStorageDirectory();
获取 SD 卡根目录
* getExternalFilesDir()
方法用于获取 /storage/emulated/0/Android/data/<application package>/files
目录
* getExternalCacheDir()
方法用于获取 /storage/emulated/0/Android/data/<application package>/cache
目录
除了上面的files目录和cache目录,我们可以根据自己的分类建立其他的目录,便于我们更好的管理
3、内部存储私有目录 VS 外部存储私有目录
不同点
默认情况下,系统并不会自动创建外部存储空间的应用私有目录。只有在应用需要的时候,开发人员通过 SDK 提供的 API 创建该目录文件夹和操作文件夹内容
自 Android 7.0 开始,系统对应用私有目录的访问权限进一步限制。其他 App 无法通过 file:// 这种形式的 Uri 直接读写该目录下的文件内容,而是通过 FileProvider 访问
宿主 App 可以直接读写内部存储空间中的应用私有目录;而在 4.4 版本开始,宿主 App 才可以直接读写外部存储空间中的应用私有目录,使开发人员无需在 Manifest 文件中或者动态申请外部存储空间的文件读写权限
相同点
- 同属于应用私有目录,当用户卸载 App 时,系统也会自动删除外部存储空间下的对应 App 私有目录文件夹及其内容。
4、最后
内部存储私有目录:
* SharedPreferences
* SQLiteDatabase
* App 中的 WebView 缓存页面信息
不要往里面存放太多的数据
外部存储私有目录:
* 应用自己使用的图片等数据
* 缓存数据
* 日志数据
如果想被其他应用访问到的数据,在 SD 卡的根目录再新建一些文件夹,就不要写在外部存储私有目录下面了。
暂时写这么多,以后开发过程中继续填补。
参考文章:
* android中的文件操作详解以及内部存储和外部存储
* 了解 Android 应用的文件存储目录,掌握持久化数据的正确姿势
* [Android入门之文件系统操作(二)文件操作相关指令](http://blog.csdn.net/mrlixirong/article/details/6800585)