一般的,我们可以通过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] 保存文件到手机内存

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

Android -- 保存文件

背景                                                                                             我们以常见 ...

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

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

[android] 保存文件到SD卡

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

android保存文件到SD卡中

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

Android NDK开发之Android.mk文件

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

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

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

Android.mk文件官方使用说明

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

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

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

随机推荐

006. C#使用WMI操作远程计算机

1. 使用WMI CIM studio 查看\root\CIMV2 所有可使用的表/字段(类/属性) , 点击下载 WMI CIM studio 2. 安装完成后打开VMI CIM studio

SQL<>0查询不到NUll的值

这几天遇到这样一个问题,sql中写<>0,刚好某个记录是NULL,道理上是满足<>0的啊,可是就是抽不出来,关于这个问题,到处找了点资料,算是这里 写一个总结出来. 用java ...

【 socke】C&num; socket端口复用-多主机头绑定

什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...

Android Studio 解决方法No JVM installation found&period; Please install a 64-bit JDK&period;

————————— Error launching Android Studio ————————— No JVM installation found. Please install a 64-bi ...

给c&plus;&plus;程序员的一份礼物——常用工具集

给c++程序员的一份礼物——常用工具集 [声明]如需复制.传播,请附上本声明,谢谢.原文出处:http://morningspace.51.net/,moyingzz@etang.com 所谓&quo ...

【js 实践】js 实现木桶布局

还有两个月左右就要准备实习了,所以特意练一练,今天终于搞定了js 的木桶布局了 这一个是按照一个插件的规格去写的以防以后工作需要,详细的解释在前端网这里 http://www.qdfuns.com/n ...

难受的ESlint语法检测

相信写过vue的各位小白都有过这样的体验,明明引入的文件语法是对的,明明自己写的代码是对的,但是总会报语法错误,没错,就是ESlint代码检测搞的鬼, 就算你在注释后面多打一个空格,它都会去搞事情,简 ...

&lbrack;Hinton&rsqb; Neural Networks for Machine Learning - Converage

Link: Neural Networks for Machine Learning - 多伦多大学 Link: Hinton的CSC321课程笔记 Ref: 神经网络训练中的Tricks之高效BP ...

FFMpeg笔记(五) 录制小视频时几个问题解决

1. YUV数据在使用avfilter scale时在特定的分辨率下UV分量不对 由于是小视频,那么分辨率不需要太高,但是有的视频源是1080p,甚至有的是4K的,所以对视频源进行scale非常有必要 ...

Ping程序的实现

Ping程序的实现 在windows系统下进行cmd可以进行ping操作. ping命令是用来确定本地主机与网络中其他主机的网络通信情况,或者查看是否是为效IP. ping的工作原理:网络另一主机发送 ...

android.mk遍历子目录,android 保存文件的各种目录列表相关推荐

  1. android.mk 强制编译,android.mk文件的编译

    android编译系统的makefile文件Android.mk写法如下 (1)   Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk ...

  2. android.mk 比较字变量,Android.mk的用法和基础

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  3. android.mk 执行脚本,Android.mk的用法

    (1)Android.mk是什么? Android.mk是Android提供的一种makefile文件.Android.mk其实是把真正的Makefile包装起来,做成了一个对使用者来说很简单的东西. ...

  4. android mk subst功能,Android.mk(零)

    Android.mk可以生产的基本文件 LOCAL_PATH:P=$(call my-dir)   //返回该Android.mk所在目录的路径,必须放在第一行 定义了当前模块的相对路径 includ ...

  5. android mk与bp,Android.bp你真的了解吗

    Android.bp你真的了解吗 前言 最近在捣鼓Android 9 和10的build系统,看到一篇比较好的博客,大名鼎鼎的gityuan的,奉上链接理解Android.bp,为了方便学习和更多的人 ...

  6. python根据url下载数据_利用Python如何实现根据URL地址下载并保存文件至对应目录...

    利用Python如何实现根据URL地址下载并保存文件至对应目录 发布时间:2020-11-16 14:23:11 来源:亿速云 阅读:58 作者:Leah 这篇文章将为大家详细讲解有关利用Python ...

  7. android.mk 优化编译,android下ndk编译c优化

    android开发中,有时候需要控制包的大小,这样就会要求对代码进行优化, 下面这个文章不错.大家可参考 原文链接 https://blog.algolia.com/android-ndk-how-t ...

  8. python os 遍历 子目录中所有文件_Python处理文件系统的10种方法 !

    通过一个能够实现与文件系统进行交互的Python程序,我们可以实现很多有趣的应用,但是大部分人并不知道如何实现这种交互.本文为相关研发人员和数据科学家提供了一个实现指南,并重点介绍10个基本的os和s ...

  9. Android.mk转换到Android.bp方法

    1.源码在:build/soong/androidmk2.编译源码后,androidmk生成工具位置 # out/soong/host/linux-x86/bin/androidmk3.使用命令 栗子 ...

最新文章

  1. 扎心了!腾讯扩招至5000人,99%应届生:与我无瓜
  2. eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案...
  3. Java 集合 List Arrays.asList
  4. wince 环境变量
  5. R语言第九讲 验证集法
  6. java websocket
  7. MySQL增量备份恢复和基于时间点与位置的恢复
  8. 一文弄清传统软件开发与互联网软件开发的异同
  9. 网易云Android高级,网易云音乐Android新版 一键升本地音质
  10. 8.4 大学生,不要再拿兴趣说事——《逆袭大学》连载
  11. error: incompatible types when assigning to type ‘const struct wiphy_wowlan_support‘
  12. 微信公众号开发使用测试号不能测试支付接口的解决方案
  13. 人工智能在量化领域应用相关论文整理
  14. 14.线程进阶操作(join,setDaemon)
  15. 【云服务器 ECS 实战】一文掌握弹性伸缩服务原理及配置方法
  16. Linux里面 grep的用法之根据关键词查询进程PID
  17. syl——linux学习(一)
  18. HotSpot JVM -- 深度好文
  19. ipad上创建html5文件,为 iBooks Author 创建 HTML5 小组件
  20. wordPress数据结构 数据库中的表、字段、类型及说明

热门文章

  1. c语言笔试题 ppt,计算机二级考试真题-PPT-陶老师-C语言入门
  2. php71u配置,IIS+php+mysql+Rewrite+navicat+Serv-u服务器环境配置(365专用)
  3. 图片过大无法发送怎么办?分享三种图片压缩工具
  4. 上传文件到服务器网页
  5. 原子操作 - ARM汇编同步机制实例(一)
  6. c语言程序设计考研大纲,沈阳建筑大学2018年C语言程序设计考研初试大纲
  7. nanopi neo2 black 音乐闹钟
  8. unite 开发_在Unite Nordic振兴您的游戏开发
  9. 2018-03-29-阿里菜鸟面试(电面一)
  10. 设计模式1——策略模式 | 适配器模式 | 工厂模式