先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统:

我们都知道Android系统内核就是个Linux、所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 “/” 接下来就是 一些文件或者文件夹,如下图:

/

├── acct

│ └── uid

│ ├── cpuacct.stat

│ └── ...

├── cache

│ ├── backup

│ │ ├── cpuacct.stat

│ │ └── ...

│ ├── lost+found

│ │ └── ...

│ ├── cpuacct.stat

│ │ └── ...

│ └── recovery

│ └── ...

├── ...

├── storage

│ ├── emulated

│ │ ├── 0

│ │ │ ├── Alarms

│ │ │ ├── Android

│ │ │ ├── backups

│ │ │ ├── DCIM

│ │ │ └── ...

│ │ │

│ │ └── obb

│ │

│ └── self

│ └── primary

│ ├── Alarms

│ └── ...

├── system

一:当然上面的有一些目录是系统级的,也就是用户是没有权限查看的(手机有root权限的话你就可以访问所有的目录了)。这里我们说一说在平常开发中经常使用到的目录,其他的有需要可以去了解一下。

应用程序的私有目录,用户无法查看,app一安装系统会自动创建 app一卸载系统也会立即删除

/data/data/packageName/

用户可以操作的文件目录

/storage/emulated/0/

二:Android 为我们提供了一系列API来获取我们需要的存储目录,如下:

Environment.getExternalStorageDirectory().getPath();

/storage/emulated/0

getExternalCacheDir().getPath();

/storage/emulated/0/Android/data/com.azhon.androiddir/cache

getCacheDir().getPath();

/data/user/0/com.azhon.androiddir/cache

getFilesDir().getPath();

/data/user/0/com.azhon.androiddir/files

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);

/storage/emulated/0/Music

type 还可以取不同的值…

/*

* @param type The type of storage directory to return. Should be one of

* {@link #DIRECTORY_MUSIC}, {@link #DIRECTORY_PODCASTS},

* {@link #DIRECTORY_RINGTONES}, {@link #DIRECTORY_ALARMS},

* {@link #DIRECTORY_NOTIFICATIONS}, {@link #DIRECTORY_PICTURES},

* {@link #DIRECTORY_MOVIES}, {@link #DIRECTORY_DOWNLOADS},

* {@link #DIRECTORY_DCIM}, or {@link #DIRECTORY_DOCUMENTS}. May not be null.

* @return Returns the File path for the directory. Note that this directory

* may not yet exist, so you must make sure it exists before using

* it such as with {@link File#mkdirs File.mkdirs()}.

*/

public static File getExternalStoragePublicDirectory(String type) {

throwIfUserRequired();

return sCurrentUser.buildExternalStoragePublicDirs(type)[0];

}

三:在这里一直没有找到怎么获取/data/data/packageName/目录,网上大部分都说是用getFilesDir()然而我获取到的路径在上面已经给出了,完全不一样。那我们要怎么获取那个路径呢?答案当然是直接写喽(反正是固定的)

缓存目录

/data/data/packageName/cache

数据库目录

/data/data/packageName/databases

文件存储目录

/data/data/packageName/files

文件缓存目录

/data/data/packageName/cache

SharedPreferences文件存储目录

/data/data/packageName/shared_prefs

四:接下来就是本文的重点了,我们都知道往手机上写入一个文件需要 [存储空间] 权限,在Android M之后 还需要动态申请权限。那么重点来了,当我们往App的缓存目录中写入一个文件 也就是/storage/emulated/0/Android/data/com.azhon.androiddir/cache目录它是不需要声明权限的 对的 你没看错是不需要权限的下面我们来试下:

public void writeToCache(View view) {

String externalCacheDir = getExternalCacheDir().getPath();

File file = new File(externalCacheDir, "test.txt");

try {

FileOutputStream stream = new FileOutputStream(file);

for (int i = 0; i < 66; i++) {

stream.write("Hello world!\n".getBytes());

}

stream.flush();

stream.close();

Toast.makeText(this, "写入成功!", Toast.LENGTH_SHORT).show();

} catch (Exception e) {

e.printStackTrace();

}

}

前往文件管理器查看一下,是存在的。

这里需要注意的是:这个目录用户是可以访问到的所以这个里的文件是有可能会被用户删除的,所以在用的时候得考虑好;如果你想不被清除那么就需要保存到/data/data/packageName/下了。

当app被卸载后这个文件夹也会被系统自动删除

往/data/data/packageName/目录下写入一个文件,也是不需要权限的。

public void writeToData(View view) {

File dir = new File("/data/data/" + getPackageName() + "/files");

if (!dir.exists()) {

dir.mkdirs();

}

File file = new File(dir.getPath(), "test.txt");

try {

FileOutputStream stream = new FileOutputStream(file);

for (int i = 0; i < 66; i++) {

stream.write("Hello Android!\n".getBytes());

}

stream.flush();

stream.close();

Toast.makeText(this, "写入成功!", Toast.LENGTH_SHORT).show();

} catch (Exception e) {

e.printStackTrace();

}

}

五:在系统设置——应用——对应的app——存储空间,这里可以看到我们app所占用的磁盘空间 和清理空间

这里的清除缓存按钮对应的就是清除我们getExternalCacheDir().getPath()目录和context.getCacheDir()下的所有文件

清除数据 就是清除我们/data/data/packageName/目录下的所有文件,同时也会清空getExternalCacheDir().getPath()目录下的所有文件

所以我们app内经常写到的一个清除缓存功能,现在就知道要怎么写了:

public void clearCache(View view) {

File externalCacheDir = getExternalCacheDir();

deleteDirFile(externalCacheDir);

Toast.makeText(this, "清除缓存成功!", Toast.LENGTH_SHORT).show();

}

/**

* 删除指定目录下文件及目录

*/

public static void deleteDirFile(File dir) {

if (dir != null && dir.isDirectory()) {

String[] children = dir.list();

for (String child : children) {

deleteDirFile(new File(dir, child));

}

}

dir.delete();

}

而不是写个这样的清除缓存

public void clearCache(View view) {

try {

Thread.sleep(666);

} catch (InterruptedException e) {

e.printStackTrace();

}

Toast.makeText(this, "清除缓存成功!", Toast.LENGTH_SHORT).show();

}

}

六:总结 当我们使用到文件存储时如:app版本更新的时候apk存放的目录就可以使用缓存目录了,这样不需要权限也可以写入,开发省心、用户也方便(-) Demo下载地址在这里

android 缓存文件目录在哪个文件夹里,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...相关推荐

  1. android手机铃声文件夹里,Android手机储存卡上的文件夹铃声不显示是怎么回事

    Android储存卡文件夹铃声不显示Android手机设置铃声的方法有很多种,不过最常用的就是在SD卡上设置几个特定名称的文件夹,然后在文件夹中放置铃声文件,然后使用手机自带的铃声设置方法就能查看到S ...

  2. android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...

    Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...

  3. android蓝牙发送文件夹里,Android蓝牙发送文件问题

    我正在编写一个小程序,通过蓝牙在Android和PC之间发送文件.我已经阅读了谷歌android站点中的蓝牙聊天示例. 目前,我的版本通过蓝牙发送文本消息非常有效,但是当我发送一些文件时,大约> ...

  4. android 根目录缓存,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...

    先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

  5. android 恢复出厂 自动恢复文件夹,基于Android系统快速恢复出厂设置方法的实现...

    龚强 摘 要:针对使用Android系统的智能电视进行恢复出厂设置时重置速度慢的情况进行了研究和分析,从其重置原理入手,通过简化备份.导入.执行等设置方法以实现该系统的快速恢复出厂设置.实践证明,该方 ...

  6. < Android数据存储> 任务二 应用程序数据文件夹里的文件读写

    :zh]Android中提供了两个方法用来打开应用程序的数据文件夹IO流. 1.FileInputStream openFileInput(String name):参数name表示某个文件名,该方法 ...

  7. 5 Android数据存储 任务二 应用程序数据文件夹里的文件读写 ,

    Android中提供了两个方法用来打开应用程序的数据文件夹IO流. 1.FileInputStream openFileInput(String name):参数name表示某个文件名,该方法用于打开 ...

  8. 百度 android 下载文件夹在哪里,手机上从百度网盘下载下来的东西在哪个文件夹里?...

    手机上从百度网盘下载下来的东西在哪个文件夹里?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 手机上从百度网盘下载下来的 ...

  9. Android中项目中各个文件夹的含义和用途详解

    1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片. ...

最新文章

  1. ReactNative生成android平台的bundle文件命令
  2. 《WCF技术剖析(卷2)》目录
  3. SQL SERVER怎么去掉重复数据?
  4. 微信小程序使用template模板
  5. 基于 Tracing 数据的拓扑关系生成原理
  6. 人工智能/数据科学比赛汇总 2019.5
  7. window环境下创建Flask项目需要安装常见模块命令
  8. 每周荐书:京东架构、Linux内核、Python全栈
  9. 日本将推出“隐形列车”,你要去体验一番吗?
  10. 20189222 《网络攻防实践》安全工具、库的简介以及使用教程
  11. Office - Excel 01
  12. 模拟CMOS集成电路设计中的电流镜及用Cadence Virtuoso IC617设计并仿真有关电路
  13. 通过PS修出自然的大长腿
  14. 许晓斌_Maven实战(四)——基于Maven的持续集成实践
  15. python画平行四边形_Python中最小的封闭平行四边形
  16. 华为交换机配置时区_华为交换机配置命令
  17. vin端口是什么意思_振荡器基础1——为什么振荡器需要正反馈?什么是LC自激振荡器?...
  18. elementUI表格无数据设置
  19. 图片题注和章节不对应
  20. MIMO中SM系统原理与仿真

热门文章

  1. Python初识面向对象
  2. 你应该了解的 5 个 JavaScript 调试技巧
  3. iOS开发中接口调用使用https
  4. php 中文转拼音,可以只转首字母,可以设置utf8、gbk
  5. 运行程序报“应用程序配置不正确”或者缺少运行库造成程序不可移植的问题...
  6. WebSocket 学习
  7. 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率
  8. webstorm javascript IDE调试
  9. 0909 初识操作系统
  10. SAE上安装第三方模块