Android 存储方式以及路径API

2017/1/31 posted in  Android

首先说一句,平时说的存储分成了内部存储和外部存储。注意内部存储又叫做机身内存,而且内存又包含了两个部分RAM(运行时内存,这个和运行速度有关系,是手机运行时存储数据和指令的地方)、ROM(这个才算是真正存储东西的内部存储范围,是应用配置和其他数据的地方);而外部存储就很明确了,用户的外部挂载存储设备,如SD卡,手机的内部存储卡。

来介绍几个概念:

一、内存

全称内部存储,英文名(InternalStorage)。当我们在打开DDMS下的File Explorer面板的时候,/data目录就是所谓的内部存储 (ROM )。

但是注意,当手机没有root的时候不能打开此文件夹。

当打开data文件夹的时候,目录结构如下:

20170227148818814550660.png
20170227148818814550660.png

这里一般都是关注两个最重要的文件夹:

  • app文件夹里存放着我们所有安装的app的apk文件,并且当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading …..就是上传我们的apk到这个文件夹,上传成功之后才开始安装。
    这里写图片描述
  • 第二个文件夹是data,也就是我们常说的/data/data目录(存储包私有数据)。此目录下将每一个APP的存储内容按照包名分类存放好。
    比如:
    • data/data/包名/shared_prefs 存放该APP内的SP信息
    • data/data/包名/databases 存放该APP的数据库信息
    • data/data/包名/files 将APP的文件信息存放在files文件夹
    • data/data/包名/cache 存放的是APP的缓存信息

多扯一句,下面的代码就会在files文件夹先创建一个hello_file文件并写入了数据:

String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_APPEND|Context.MODE_WORLD_READABLE);
fos.write(string.getBytes());
fos.close();

二、外存

/storage/sdcard/Android/data目录或者说/storage/emulated/0/Android/data包目录属于外部存储。比如我们的内部存储卡。
注意,Google官方建议开发者将App的数据存储在私有目录即/storage/emulated/0/Android/data包下,这样卸载App时数据会随之被系统清除,不会造成数据残留。

三、除了/data之外的存储目录

  1. /mnt:这个目录专门用来当作挂载点(MountPoint)。通俗点说,/mnt就是来挂载外部存储设备的(如sdcard),我们的sdcard将会被手机系统视作一个文件夹,这个文件夹将会被系统嵌入到收集系统的mnt目录
  2. /dev包:Linux系统的常规文件夹。
  3. /system包:系统配置的文件夹,比如Android系统框架(framework)、底层类库(lib)、字体(font)等。

  • 1、下面说一下路径API和对以上的文件的操作:
    context.getFilesDir().getAbsolutePath()
    context.getFilesDir().getPath()

上面的两个API都是得到应用程序私有目录下的文件路径:

/data/data/包名/files

  • 2、context.getCacheDir().getPath()

    取得应用程序的缓存文件在内部存储上的存储路径

    /data/data/包名/cache

  • 3、context.getExternalCacheDir().getAbsolutePath()context.getExternalCacheDir().getCanonicalPath()
    取得应用程序的缓存文件在外部存储上的存储路径

    /storage/sdcard/Android/data/包名/cache

  • 4、context.getObbDir().getAbsolutePath()
    取得外部存储obb目录的根路径

    /storage/sdcard/Android/obb/包名

  • 5、Environment.getExternalStorageState()

    得到外部存储卡(sdcard)的存储状态

    mounted

  • 6、Environment.getExternalStorageDirectory().getAbsolutePath()

    得到外部存储的整个根路径

    /storage/sdcard

  • 7、Environment.getDownloadCacheDirectory().getAbsolutePath()

    得到外部存储的下载文件的缓存路径
    /cache

  • 8、Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()

    得到外部存储的图片的根路径

    /storage/sdcard/Pictures

  • 9、Environment.getRootDirectory().getAbsolutePath()

    /system

  • 10、Environment.getDataDirectory().getAbsolutePath()

/data

最后总结一下:

  • 内部数据:/data/data/包名/XXX
  • 外部私有数据:/storage/emulated/0/Android/data/包名/XXX
  • 外部公有数据:/storage/emulated/0/包名/XXX

当用应用管理来清除数据的时候:

  • 清除缓存:将外部私有数据下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,将内部数据下的cache包下的内容(/data/data/包名/cache/XXX)清除 。
  • 清楚数据:将外部私有数据包(/storage/emulated/0/Android/data/包名)清除,将内部数据下的所有内容(/data/data/包名/XXX)清除;