【Android内外存基础】以及各存储文件的路径的获取

Android内外存储基础知识

Android手机上的存储空间可做如下划分:

  • 内存:RAM
  • 内部存储:内部ROM
  • 外部存储:外部ROM和SDCard

手机上的存储在概念上分成了”内部internal“和”外部external“两部分,但其实都在手机内部。
因此无论Android手机是否有可移动的sdcard,它都有外部存储和内部存储,且通过相同的Api方法来访问可移动的sdcard或者手机自带的存储。

【Android内外存基础】以及各存储文件的路径的获取_第1张图片
(1)内部存储:

Android可以说是一个Linux操作系统,它的内部存储空间对于应用程序和用户来讲就是“/data/data“目录。内部存储与外部存储相比有着比较稳定,存储方便,操作简单,更加安全(可以控制访问权限)等优点,而它唯一的缺点就是空间有限。

内部存储空间的有限意味着应物尽其用,用来保存比较重要的数据,例如用户信息资料,口令秘码等不需要与其他应用程序共享的数据。注意应用程序被卸载时,应用程序在内部存储空间的文件数据将全部被删除,避免占用宝贵的空间。

内部存储即data文件夹,其中里面有两个文件夹值得关注:

app文件夹(未root无法打开):存放着所有app的apk文件夹,当开发者调试某个app时,AS控制台输出的内容中有一项是uploading…,代表正在上传apk到这个文件夹。
data文件夹:内部都是app的包名,存储着应用程序相关的数据,例如 data/data/包名/(shared_prefs、database、files、cache)

(2)外部存储

外部存储是指用户在使用时自行在手机上添加的外部存储介质,例如TS卡,SD卡等闪存储介质。其显著的优点就是存储空间大,无需担心数据清除问题,与内部存储不同的是当应用程序卸载时,它在外部存储所创建的文件数据不会被清除,因此清理外部存储空间的责任丢给了用户自己。缺点则是不太稳定,闪存介质对于Android手机而言会出现SD卡不能正常使用的情况。

外部存储即storage文件夹或mnt文件夹。需要注意的是storage中有一个sdcard0文件夹,其中又分为公有目录和私有目录:

公有目录:有9大类,比如DCIM、Download等系统为用户创建的文件夹;
私有目录: 即Android文件夹/storage/sdcard/Android/,其中的data文件夹包含了许多包名组成的文件夹。

若应用程序在运行过程中需要向手机上保存数据,通常是保存在sdcard中/storage/sdcard,即应用直接在sdcard的根目录创建一个文件夹用于数据保存,不过当该app被卸载后,数据还保留在sdcard中,意味着留下了垃圾数据。

(3)内外部存储常用目录操作

  • context.getFilesDir() 内部存储data/data/包名/files目录
  • context.getCacheDir() 内部存储data/data/包名/cache目录
  • Environment.getExternalStorageDirectory() 外部存储根目录
  • Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM) 外部存储公有目录
  • context.getExternalFilesDir() 外部存储私有目录storage/sdcard/Android/data/包名/files。一般存储长时间保存的数据。
  • context.getExternalCacheDir() 外部存储私有目录storage/sdcard/Android/data/包名/cache。一般存储临时缓存数据。
    注意上述最后两个API:当app被卸载后,sdCard/Android/data/PackageName/下的所有文件都会被删除,不会留下垃圾信息。两个API对应的目录分别对应着 设置->应用->应用详情里面的“清除数据”与“清除缓存”选项。

二. 各个易混淆路径识别

  1. 文件夹中0的出现
    在Android版本4.2JellyBean之前,获取sdcard的路径是/sdcard/,但在JellyBean版本之后的路径成为了/sdcard/0,或者是/sdcard/legacy(legacy可以是0、1、2……),这个“0”到底代表着什么含义?

这是从JellyBean版本起的一个新特征——多用户。因此为了处理单独的账户,部分目录结构必须被改变,/sdcard/legacy始终指向当前登录的用户的SD卡目录。

正因“多用户”功能的增加,内外部存储发生了以下变化:

内部存储: 原先的/data/data/其实相当于直接链接到当前用户文件夹的,变成了/data/user/0/。
外部存储:例如sd卡路径不再是/sdcard/,而是/sdcard/legacy/(legacy可以是0、1、2……),其中的“0”可以当成“设备拥有者”,或者称为“第一用户”(“第一用户”毫无疑问的是“设备所有者”,只有此用户才能创建额外账户)。
大致理解了其由来后,可能少数人还遇到过/sdcard/0/0 这种表示,以下是谷歌对此的官方解释:

Google在Android 4.2中引入了“多个用户”作为新功能, 为了适应“多个用户”,Google现在为每个用户提供了自己的文件夹以供存储。 如果您从4.1升级到4.2,则4.2 ROM将在/data中查找某个文件,以确定是否需要将所有文件迁移到新的多用户数据结构。 默认情况下,4.2将所有/data/media迁移到/data/media/0。不过使用自定义恢复会出现问题,自定义恢复在出厂重置期间会保留/data/media文件夹。当您重新设置工厂并再次启动4.2 ROM时,4.2 ROM将再次迁移/data/media中的所有内容。 每次出厂重置时它都会迁移您的文件,这种多次迁移会导致一些人将他们的文件移动到/sdcard/0甚至/sdcard/0/0等等。

原文链接:https://blog.csdn.net/itermeng/article/details/79423035

你可能感兴趣的:(Android,android,android,studio,ide)