Android-内部存储和外部存储
学习自
blog.csdn.net/u012702547/… blog.csdn.net/u010937230/… developer.android.com/guide/topic…
内存,内部存储,外部存储,概念的区分
随着Android的发展,这个几个名词真的是越来越见了鬼了,想起来就是头疼,首先呢,我们要把这些概念搞清楚。
内存(Memory/RAM): 本来这个名词的英语是不会产生歧义的,但是因为两个语言之间的翻译的问题,在加上很多人喜欢将 内部存储(Internal Storage)
简称为 内存
:cry:。 因此就很容就造成干扰。 简单的来说 RAM 是一种临时的数据存储器,当断电后数据就会消失,并且读取和写入的速度非常快。通常我们所说的手机的运行内存就是它了(关于更专业的解释可以交给度娘)。对于这个名词我更喜欢称之为 Memory
而不是“内存”以免造成意义上的混淆 :smile:。
内部存储(Internal Storage) 和 外部存储(External Storage) 可以分别从 物理
和 逻辑
区分。
从物理角度来说,手机自带的存储空间就是内部存储,外外置的存储设置比如说 SD卡
就是外部存储。
从逻辑意义上来说,data
目录就是就是就是手机的内部存储,而 mnt
或者 storage
目录下的sdcard
目录就是外部存储。如果是手机内存的外部存储被称为机身外部存储,外置的SD卡则称之为外部存储。当然都称两者为外部存储也没关系。在这里还是希望大家能够用英文来称呼它们。
在原先的时候内部存储和外部存储是分开的,这种很好理解也很好区分(这种情况多发生Android4.4 及以前),但是随着Android手机的发展,渐渐的都做成了一体机甚至将内部存储和外部存储都集成在了一起,只是在逻辑上区分了内部存储和外部存储。甚至到了现在很多厂商连外置SD卡的卡槽都不提供了。
下面的这一张图希望可以帮助你理解:
内部存储中都放了哪些东西
在代表Internal Storage的data
目录下有两个目录是我们需要注意的。
- app 目录,是所有的已经安装了的APP的
APK
的存放目录。 - data 目录,是各个程序存放自己的私有的数据的地方比如郭
SharedPreferences
Sqlite数据库
缓存文件
等。在这些数据其他人都是无法访问的,只有该APP的才能够访问。当然如果想将让其他的APP可以访问自己的APP的私有的数据,可以使用ContentProvider
将想要公开的数据暴露出来,就像是我们所有的APP如果有相应的权限的话,都可以读取手机的联系人信息一样。同时当用户卸载APP后data目录下对应着APP的目录页会被删除。当通过 【设置】中的【APP信息信息】中的选线也可以选择清除data或者清除缓存那么,APP对应包名目录下相应的数据就会被删除。
PS: 除了data目录,APP在外部存储中同样有一用来存储私有的数据的地方,接下来会讲到。
外部存储中有哪些文件
mnt下的sdcard就是我们的 External Storage了(根据不同的设备也可能是storage目录下的sdcard目录),其中 Android
目录需要我们特别注意。其中也有一个 data
目录其下存在着非系统APP的对应的包名的目录, 跟 Internal Storage 中data/data 目录的作用相同。都是存储一些私有的数据,相对于Internal Storage data/data/对应包名的目录, 此目录更适合存储一些比较大的私有的媒体文件,比如说 音乐,图片等。 Android目录也是一个私有存储目录。其他程序无权访问。
大家都看到了上图中除了 Android目录外还有不少替他的目录,这是都是共有存储,只要有SD卡的操作权限都可以读取或者写入。其中按照不同的文件类型分了几个不同的目录比如说 Dlownload(下载的文件应该存放到此目录)
Music(音乐应该存放到此目录)
等等。
PS: 虽然SD卡是共有的外部存储,大家都可以访问,但是如果可以的话,请将文件按照不同的分类放到不同的目录下,而不是自己在 sdcard
的根目录下自己再创建一个目录。 Android系统的生态需要我们自己来维护,与诸君共勉 :smile:。
Clear Data 和 Clear Catch
这个界面大家应该都比较熟悉了吧,其中 CLEAR DATA
和 CLEAR CATCH
两个按钮应该是我们经常用的。
- CLEAR DATA: 清除的是 data/data/对应程序包名 的文件夹下的所有的文件全都会被删除,mnt/sdcard/Android/对应程序包名 下的所有的数据也都会被删除。
- CLEAR CACHE: 清除的数据是 data/data/对应程序包名/catch 目录下的数据,还有 mnt/sdcard/Android/对应程序包名/catch目录下的数据
通过Context访问程序的私有目录
Context提供的路径都有一个特点,都是当前App私有的,其他的App无权限访问。即这些目录是当前应用程序的私有目录。
方法 | 解释 |
---|---|
getFilesDir | 获取的 data/data/程序包名/files 这个目录 |
getCatch | 获取的 data/data/程序包名/catch 这个目录 |
getExternalCacheDir | 获取的是 mnt/sdcard/Android/程序包名/catch这个目录 |
getExternalFilesDir(type:String) | 获取指定类型的文件目录位于 mnt/sdcard/Android/程序包名/files/<指定类型的目录(例如 Downlaod))> |
//create some files for testing
fun createSomeFiles(view: View) {
File(this.filesDir, "tempFile.txt").writeText("Hello world")
File(this.cacheDir, "tempCatch.txt").writeText("Hello internal catch")
File(this.getExternalFilesDir(android.os.Environment.DIRECTORY_DOWNLOADS), "tempDownload.txt").writeText("Hello test")
File(this.externalCacheDir, "externalCatch.txt").writeText("ExternalCatch.txt")
}
复制代码
通过Environment类访问手机的公有目录
通过Environment类获取目录是程序的公有目录,因为是操作SD卡,所以在需要有读写SD卡的权限,并且在Android 6.0 及以上的机器的时候,还需要动态申请权限。
方法 | 解释 |
---|---|
Environment.getExternalStorageState() | 获取当前SD卡的状态 |
Environment.getExternalStoragePublicDirectory(type:String) | 获取SD卡指指定类型的目录 |