一般的,我们可以通过context和Environment来获取要保存文件的目录

($rootDir)
+- /data -> Environment.getDataDirectory()
| |
| | ($appDataDir)
| +- data/com.srain.cube.sample
| |
| | ($filesDir)
| +- files -> Context.getFilesDir() / Context.getFileStreamPath("")
| | |
| | +- file1 -> Context.getFileStreamPath("file1")
| | ($cacheDir)
| +- cache -> Context.getCacheDir()
| |
| +- app_$name ->(Context.getDir(String name, int mode)
|
($rootDir)
+- /storage/sdcard0 -> Environment.getExternalStorageDirectory()
| / Environment.getExternalStoragePublicDirectory("")
|
+- dir1 -> Environment.getExternalStoragePublicDirectory("dir1")
|
| ($appDataDir)
+- Andorid/data/com.srain.cube.sample
|
| ($filesDir)
+- files -> Context.getExternalFilesDir("")
| |
| +- file1 -> Context.getExternalFilesDir("file1")
| +- Music -> Context.getExternalFilesDir(Environment.Music);
| +- Picture -> ... Environment.Picture
| +- ...
|
| ($cacheDir)
+- cache -> Context.getExternalCacheDir()
|
+- ???

各个路径的特性

下面介绍这些路径的特性以及使用中需要注意的细节:

1.根目录($rootDir):

  • 内部存储路径: /data, 通过Environment.getDataDirectory() 获取
  • 外部存储路径: /storage/sdcard0 (也有类似 /mnt/ 这样的),通过Environment.getExternalStorageDirectory()获取

  示例

   

Environment.getDataDirectory():
/data Environment.getExternalStorageDirectory():
/storage/sdcard0

2.应用数据目录($appDataDir)

  • 内部储存: $appDataDir = $rootDir/data/$packageName,
  • 外部存储: $appDataDir = $rootDir/Andorid/data/$packageName

  在这些目录下的数据,在app卸载之后,会被系统删除,我们应将应用的数据放于这两个目录中。

3.外部存储中,公开的数据目录。 这些目录将不会随着应用的删除而被系统删除,请斟酌使用:

    

Environment.getExternalStorageDirectory():
/storage/sdcard0 // 同 $rootDir
Environment.getExternalStoragePublicDirectory(""):
/storage/sdcard0 Environment.getExternalStoragePublicDirectory("folder1"):
/storage/sdcard0/folder1

4.应用数据目录下的目录

  一般的在$appDataDir下,会有两个目录:

  1. 数据缓存:$cacheDir = $appDataDir/cache:

    •   内部存储:Context.getCacheDir(), 机身内存不足时,文件会被删除
    • 外部存储:Context.getExternalCacheDir()

      外部存储没有实时监控,当空间不足时,文件不会实时被删除,可能返回空对象

      示例

    Context.getCacheDir():
/data/data/com.srain.cube.sample/cache Context.getExternalCacheDir():
/storage/sdcard0/Android/data/com.srain.cube.sample/cache

  2.文件目录 $filesDir = $appDataDir/files:

    内部存储:通过Context.getFilesDir() 获取

    Context.getFileStreamPath(String name)返回以name为文件名的文件对象,name为空,则返回 $filesDir 本身

    示例:

    

Context.getFilesDir():
/data/data/com.srain.cube.sample/files Context.getFileStreamPath(""):
/data/data/com.srain.cube.sample/files Context.getFileStreamPath("file1"):
/data/data/com.srain.cube.sample/files/file1

    外部存储:通过Context.getExternalFilesDir(String type)type为空字符串时获取.

    type系统指定了几种类型:

    Environment.DIRECTORY_MUSIC

    Environment.DIRECTORY_PICTURES ...

   示例

  

    Context.getExternalFilesDir(""):
/storage/sdcard0/Android/data/com.srain.cube.sample/files Context.getExternalFilesDir(Environment.DIRECTORY_MUSIC)
/storage/sdcard0/Android/data/com.srain.cube.sample/files/Music

  3.$cacheDir / $filesDir 安全性

  在内部存储中,$cacheDir$filesDir是app安全的,其他应用无法读取本应用的数据,而外部存储则不是。

  在外部存储中,这两个文件夹其他应用程序也可访问。

  在外部存储中,$filesDir中的媒体文件,不会被当做媒体扫描出来,加到媒体库中。

  4.$cacheDir / $filesDir 同级目录

  在内部存储中:通过 Context.getDir(String name, int mode)可获取和 $filesDir / $cacheDir 同级的目录

  目录的命名规则为 app_ + name, 通过mode可控制此目录为app私有还是其他app可读写。

  示例:

    Context.getDir("dir1", MODE_PRIVATE):
Context.getDir: /data/data/com.srain.cube.sample/app_dir1

  5.特别注意, 对于外部存储,获取$cacheDir 或者 $filesDir及其下的路径

  在API level 8 以下,或者空间不足,相关的方法获路径为空时,需要自己构造。

@TargetApi(VERSION_CODES.FROYO)
public static File getExternalCacheDir(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO)) {
File path = context.getExternalCacheDir(); // In some case, even the sd card is mounted,
// getExternalCacheDir will return null
// may be it is nearly full.
if (path != null) {
return path;
}
} // Before Froyo or the path is null,
// we need to construct the external cache folder ourselves
final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
}

参考:http://liaohuqiu.net/cn/posts/storage-in-android/

android 保存文件的各种目录列表的更多相关文章

  1. [android] 保存文件到手机内存

    /*****************2016年5月4日 更新*******************************/ 知乎:Android 没有沙盒保护机制吗,WhatsApp 信息为何可被随 ...

  2. Android -- 保存文件

    背景                                                                                             我们以常见 ...

  3. DFS遍历拷贝所有子文件夹及目录列表 (Java版)

    如题 注意,文件夹是不能拷贝的, 需要mkdir的 文件选择合适的流进行拷贝 main测试方法 /** * 主测试类,默认将D:\\base01 下的复制到D:\\base02 * @param ar ...

  4. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  5. android保存文件到SD卡中

    想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...

  6. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  7. Android.mk文件语法规范及使用模板

    Android.mk文件语法详述 介绍:------------这篇文档是用来描述你的C或C++源文件中Android.mk编译文件的语法的,为了理解她们我们需要您先看完docs/OVERVIEW.h ...

  8. Android.mk文件官方使用说明

    本页介绍了 ndk-build 所使用的 Android.mk 编译文件的语法. 概览 Android.mk 文件位于项目 jni/ 目录的子目录中,用于向编译系统描述源文件和共享库.它实际上是编译系 ...

  9. 写文件前, 检查目录写权限(PHP)

    写文件前, 检查目录写权限 写或保存文件前, 确保目录是可写的, 假如不可写, 输出错误信息. 这会节约你很多调试时间. linux系统中, 需要处理权限, 目录权限不当会导致很多很多的问题, 文件也 ...

随机推荐

  1. 《数据结构》2.3单链表(single linked list)

    //单链表节点的定义 typedef struct node { datatype data; struct node *next; }LNode,*LinkList; //LNode是节点类型,Li ...

  2. Yii2 rules 添加时间比较功能

    php比较类文件:yiisoft\yii2\validators\CompareValidator.php JS比较类文件: yiisoft\yii2\assets\yii.validation.js ...

  3. 适配iOS10 的相关权限设置

    解决办法(fix method):在info.plist —Source Code中添加UsageDescription相关的key, 描述字符串自己随意填写就可以,但是一定要填写,不然会引发包无效的 ...

  4. 从新 开始学习java

    今天备受打击了,群里 发一个段 招租的代码.挺火的,一时没想出来.就亲测了一遍.做了两遍才看出来原因,对此感觉基础不扎实,从新学习,当做复习. 群里传的代码 亲测,代码. 了解缘由. package ...

  5. gnome3.X添加开机启动项

    背景:升级gnome后发现gnome-session-properties不见了,想把sslocal随机启动遇到了麻烦... 特别说明:此为图形桌面开机启动项,因此只有通过图形桌面登陆用户后才能启动. ...

  6. 课程笔记:——Javascript 中的预解释1

    1.预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义var num = 12;声明(declare): var num; ...

  7. 【转】RadControls for Silverlight(学习2-RadDataPager)

    引用地址:http://www.cnblogs.com/forrestsun/archive/2011/05/15/2046894.html <Grid x:Name="LayoutR ...

  8. 配置指定使用tcc编译器编译nim程序

    1.前言 nim是什么? nim是一门静态编译型语言,语法类似python,nim的代码被翻译成C代码再被C编译器编译成可执行文件.因此nim的可执行文件比较小,性能应该也不错. 最简单的nim程序就 ...

  9. 支付宝即时到账API,网站收到回调页面,输出验证失败,log中responseTxt=错误的问题

    看了网上无外乎这三种原因导致: 1.参数编码问题 2.参数多余问题 3.网络延时问题 以上三种可以参考这个网站给出的解决办法:http://blog.csdn.net/zj53hao/article/ ...

  10. MVC 请求处理流程(一)

    路由系统先获取路由数据,在实现了IHttpModule接口的UrlRoutingModule对象中通过注册HttpApplication的PostResolveRequestCache来解析路由数据并 ...