Android-内部存储和外部存储

Android-内部存储和外部存储

学习自

https://blog.csdn.net/u012702547/article/details/50269639
https://blog.csdn.net/u010937230/article/details/73303034
https://developer.android.com/guide/topics/data/data-storage#filesExternal

内存,内部存储,外部存储,概念的区分

随着Android的发展,这个几个名词真的是越来越见了鬼了,想起来就是头疼,首先呢,我们要把这些概念搞清楚。

内存(Memory/RAM): 本来这个名词的英语是不会产生歧义的,但是因为两个语言之间的翻译的问题,在加上很多人喜欢将 内部存储(Internal Storage) 简称为 内存 :cry:。 因此就很容就造成干扰。 简单的来说 RAM 是一种临时的数据存储器,当断电后数据就会消失,并且读取和写入的速度非常快。通常我们所说的手机的运行内存就是它了(关于更专业的解释可以交给度娘)。对于这个名词我更喜欢称之为 Memory 而不是“内存”以免造成意义上的混淆 :smile:。

内部存储(Internal Storage) 和 外部存储(External Storage) 可以分别从 物理逻辑 区分。

从物理角度来说,手机自带的存储空间就是内部存储,外外置的存储设置比如说 SD卡 就是外部存储。

从逻辑意义上来说,data 目录就是就是就是手机的内部存储,而 mnt 或者 storage 目录下的sdcard目录就是外部存储。如果是手机内存的外部存储被称为机身外部存储,外置的SD卡则称之为外部存储。当然都称两者为外部存储也没关系。在这里还是希望大家能够用英文来称呼它们。

在原先的时候内部存储和外部存储是分开的,这种很好理解也很好区分(这种情况多发生Android4.4 及以前),但是随着Android手机的发展,渐渐的都做成了一体机甚至将内部存储和外部存储都集成在了一起,只是在逻辑上区分了内部存储和外部存储。甚至到了现在很多厂商连外置SD卡的卡槽都不提供了。

下面的这一张图希望可以帮助你理解:
InternalStorageAndExternalStorage

内部存储中都放了哪些东西

InternalStorageContent

在代表Internal Storage的data 目录下有两个目录是我们需要注意的。

  • app 目录,是所有的已经安装了的APP的 APK 的存放目录。
  • data 目录,是各个程序存放自己的私有的数据的地方比如郭 SharedPreferences Sqlite数据库 缓存文件 等。在这些数据其他人都是无法访问的,只有该APP的才能够访问。当然如果想将让其他的APP可以访问自己的APP的私有的数据,可以使用 ContentProvider 将想要公开的数据暴露出来,就像是我们所有的APP如果有相应的权限的话,都可以读取手机的联系人信息一样。同时当用户卸载APP后data目录下对应着APP的目录页会被删除。当通过 【设置】中的【APP信息信息】中的选线也可以选择清除data或者清除缓存那么,APP对应包名目录下相应的数据就会被删除。

PS: 除了data目录,APP在外部存储中同样有一用来存储私有的数据的地方,接下来会讲到。

外部存储中有哪些文件

ExternalStorage

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

ClearDataAndClearCatch

这个界面大家应该都比较熟悉了吧,其中 CLEAR DATACLEAR 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卡指指定类型的目录
Last modification:September 4th, 2018 at 02:53 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment