浅析 Android 存储方式以及路径 API

5,150 阅读4分钟
原文链接: blog.csdn.net

首先声明:本篇博客是2017年以来的原创的第一篇的博客,而且本人也已经下定决心,2017年是个新的开始。自此之后的博客都要提高质量,真正将自己的所得分享给需要的Android开发者。PS(如果有不合理之处,希望各位大佬不吝赐教)

好,废话少说,直接进入正题。

其实本人在刚接触Android的时候就对Anroid系统的存储方式感到迷惑,因而好好整理了一番。

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

来介绍几个概念:

(一)
内存:全称内部存储,英文名(InternalStorage)。当我们在打开DDMS下的File Explorer面板的时候,/data目录就是所谓的内部存储 (ROM )。
但是注意,当手机没有root的时候不能打开此文件夹。
当打开data文件夹的时候,目录结构如下:

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

下面说一下路径API和对以上的文件的操作:
1.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)清除;