Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解

首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云。
Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的。git

1、概念web

内部存储是指系统内部存储空间,在逻辑上用目录来区分的话就是data目录下的文件夹
除此以外data目录下有app目录存放系统下载的apk信息,有data目录存放各类文件
例如:
sharedPreferenced存储的文件在 /data/data//shared_prefs/目录下。
Sqlite存储的文件在 /data/data//database/目录下。缓存

外部存储就简单多了
一、手机厂商自带存储,也就是常说的 16GB、64GB等
二、SD卡
这些都是外部存储app

2、获取可操做内部存储目录(随着用户删除app而删除)ide

getCacheDir().getPath():内部缓存目录

/data/user/0/packname/cache/      //7.0以上
/data/data/packname/cache/



getFilesDir().getPath():内部文件目录

/data/user/0/packname/files/
/data/data/packname/files/

shared_prefs和database两个文件夹有sharedPreferenced和Sqlite这些专门工具去操做。svg

注:data/data/…和data/user/0/… 区别是后者区分用户,不过这不重要工具

3、获取可操做外部存储目录code

外部存储分为外部公共目录、外部私有目录、缓存目录:视频

一、外部九大公共目录:xml

Environment.getExternalStoragePublicDirectory(context,type);

/storage/emulate/0/....

有九种type,分别对应不一样的目录,以下

DIRECTORY_MUSIC:音乐类型    /storage/emulate/0/music
DIRECTORY_PICTURES:图片类型
DIRECTORY_MOVIES:电影类型
DIRECTORY_DCIM:照片类型,相机拍摄的照片视频都在这个目录(digital camera in memory) 
DIRECTORY_DOWNLOADS:下载文件类型   /storage/emulate/0/downloads
DIRECTORY_DOCUMENTS:文档类型
DIRECTORY_RINGTONES:铃声类型
DIRECTORY_ALARMS:闹钟提示音类型
DIRECTORY_NOTIFICATIONS:通知提示音类型

二、外部私有目录 (随着用户删除app而删除)

getExternalFilesDir(type)

/storage/emulated/0/Android/data/packagename/files/

三、外部缓存目录(随着用户删除app而删除)

getExternalCacheDir()

/storage/emulated/0/Android/data/packname/cache/

四、外部根目录

Environment.getExternalStorageDirectory()

/storage/emulated/0
路径 方法名 所属
/data/data/<包名>/files getFilesDir() 内部
/data/data/<包名>/cache getCacheDir() 内部
/data/data/<包名>/app_ getDir() 内部
/storage/emulated/0 Environment.getExternalStorageDirectory() 外部根目录
/storage/emulated/0/ Environment.getExternalStoragePublicDirectory(type) 外部九大公有目录
/storage/emulated/0/Android/data/<包名>/files/ getExternalFilesDir(type) 外部私有目录
/storage/emulated/0/Android/data/<包名>/cache getExternalCacheDir() 外部缓存目录

注:不管外部内部,只要路径中有包名,就是私有的,用户须要root才能访问。获取路径的方法均是Context调用的,且随着用户删除app而销毁,没有包名的路径均是Environment调用的。

注:
FileProvider的paths与对应目录解析:

root-path 对应DEVICE_ROOT,也就是File DEVICE_ROOT = new File("/"),即根目录,通常不须要配置。 files-path对应 getFilesDir() 获取到的内部文件目录。 cache-path对应 getCacheDir() 获取到的内部缓存目录。 external-path对应 Environment.getExternalStorageDirectory() 指向的外部根目录。 external-files-path对应 ContextCompat.getExternalFilesDirs() 获取到的外部私有目录。 external-cache-path对应 ContextCompat.getExternalCacheDirs() 获取到的外部缓存目录。