Android 目录

一、Android中 getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()区别

应用程序在运行过程中如果需要在手机上保存数据,一般把数据保存在SDCard中,大部分应用会直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中,但应用卸载后数据还是会保留在SDCard中,解决方法:

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/包名/files/ 目录

通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/包名/cache/目录

使用上面的方法,应用卸载后,SDCard/Android/data/包名/ 目录下的所有文件都会被删除。而且上面两个目录对应手机设置里面的“清除数据”与“清除”缓存选项,如果要保存下载的内容就不要放在这两个目录下。

当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则调用getCacheDir()方法来获取缓存路径,这两种方式的缓存都会在应用卸载后被系统清理掉,而如果是另行在SD卡上新建的缓存文件夹,是不会随应用的卸载而被清除掉。

Context.getCacheDir() 获取/data/data/包名/cache目录 (应用安装目录下的cache文件)

Context.getFilesDir() 获取/data/data/包名/file目录 (应用安装目录下的file文件)

Context.getExternalFilesDir() 获取SDCard/Android/data/包名/files/目录

Context.getExternalCacheDir() 获取SDCard/Android/data/包名/cache/目录

Environment.getExternalStorageDirectory() 获取SD卡根目录

Environment.getExternalStoragePublicDirectory(Environment.xxx) 获取SD卡公共目录
比如:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 目录为:mnt/sdcard/Pictures;

总结:
相同点:
1、相同点:都可以做app缓存目录。
2、app卸载后,两个目录下的数据都会被清空。

不同点:
1、目录的路径不同。前者的目录存在外部SD卡上的。后者的目录存在app的内部存储上。
2、前者的路径在手机里可以直接看到。后者的路径需要root以后,用Root Explorer 文件管理器才能看到。

获取缓存地址的方法:
需要注意的事项:
由于context.getExternalCacheDir() 的目录存在外部SD卡上的,所以在使用这个方法的时候要判断外部SD卡的状态是否可用。
public String getDiskCacheDir(Context context) {
String cachePath = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}

二、Android目录获取

(1)/data/data/package_name/...(该目录只对应用可见,如果手机没有root,用普通权限的adb也看不了,该目录用来存储和应用周期相关的文件,随应用的卸载一起删除),相关子目录如下:

1、/data/data/package_name/shared_prefs/(用来存储SharedPreference,对应函数为:getSharedPreferences(String fileName,int mode))

2、/data/data/package_name/databases/(用来存储数据库DB,对应函数:getDatabasePath())

3、/data/data/package_name/app_webview和/data/data/package_name/xxxwebviewcachexxx(用来存储应用内置webview所产生的cache和cookies,该目录由于android版本不同名字和位置也可能不同)

4、/data/data/package_name/lib(用来存储该应用的.so静态文件)

5、/data/data/package_name/cache(通过函数getCacheDir()获取)

6、/data/data/package_name/files(该目录可通过函数getFilesDir()获取,openFileInput()和openFileOutput()函数也是在该目录下操作文件,fileList()函数是用来列出该files目录下的所有文件,deleteFile(String name)用来删除该files目录下的文件)

7、/data/data/package_name/xxx(这个目录下还能够创建xxx子目录,使用方法就是getDir(String name,int mode),参数中的name就是需要在该目录下创建的子目录名字)

getPackageCodePath() = /data/app/package_name.apk;
getPackageResourcePath() = /data/app/package_name.apk。
注:以上函数没有明确指定的都是使用 Context 调用。

(2)SD卡下的目录
SD卡下分为应用的私有目录和共有目录,SD卡不可用时这两个目录都是无效的。私有目录的生命周期也是和应用挂钩的,卸载之后就会被删除,共有目录不会随着应用的卸载而删除。
可以通过 Environment.getExternalStorageState() 函数来获取 SD 卡的挂载状态,当该函数返回mounted的时候,代表SD卡可用。
注意:SD卡使用时需要注册相关权限:<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>

1、SD卡私有目录(该目录下的文件卸载应用之后会自动删除)
/sdcard/Android/data/package_name/

/sdcard/Android/data/package_name/files/(该目录可用 getExternalFilesDir(String type)获取)
Context.getExternalFilesDir(""): /storage/emulated/0/Android/data/package_name/files
Context.getExternalFilesDir("test"): /storage/emulated/0/Android/data/package_name/files/test
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES): /storage/emulated/0/Android/data/package_name/files/Pictures

Android/data/com.android.framework/cache/(该目录可用getExternalCacheDir()获取)

/sdcard/Android/obb/package_name/
需要注意的是,obb 目录也可能不存在,一般游戏 APP 会将游戏相关的数据包放到这个目录下。
该目录的的相关函数简单只有两个:getObbDirs() 和 getObbDir(),前者调用之后会自动生成该目录,后者在插入外置存储卡之后会在前者的基础上另外返回外置存储卡的obb目录

2、SD 卡共有目录
该目录下的文件卸载应用之后还会留存,所以为了SD卡的整洁度,不要随便在SD卡的根目录下面创建文件,最好以应用名字创建一个目录,所有的需要卸载之后留存或者需要给其他应用共享的文件都放到该目录下,不要在根目录下创建文件,还有一个公司的多个应用最好共享一个目录。

/sdcard/(any_folder_name)

Environment.getExternalStorageState()(这个函数用来获取SD卡的挂载状态,如果传入参数path则是获取该路径的的挂载状态)

Environment.getExternalStorageDirectory()(该函数用来返回SD卡的根目录)

Environment.getDownloadCacheDirectory()(该函数用来返回SD卡的下载缓存目录)

Environment.getDataDirectory()(该函数用来获取用户的数据目录)

Environment.getExternalStoragePublicDirectory(String type)(该函数用来根据类型返回相关目录,类型为 Environment 的一些变量,传入的类型参数不能是 null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,没有就创建该目录)

Environment.getRootDirectory()(该函数用来返回根 System 目录,只挂载为只读)

配置访问外部存储的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 一、Android缓存机制 Android缓存分为内存缓存和文件缓存(磁盘缓存)。在早期,各大图片缓存框架流行之前...
    流水潺湲阅读 37,359评论 3 33
  • 文件存储和清理: 可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir(...
    3Q竹林阅读 2,190评论 0 2
  • 版权声明:本文为作者原创,转载必须注明出处。 转载请注明出处:http://www.jianshu.com/p/7...
    Stan_Z阅读 1,452评论 0 7
  • 注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。 文章内容来自:android...
    Amy_LuLu__阅读 3,904评论 0 2
  • 女人很喜欢这间厨房,干净的灰色台板泛出冷冷的光泽。一整套的刀具摆在那里,看着就让人安心。 她在做早餐,...
    悦兮yuexi阅读 408评论 2 8