先简要介绍一下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

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!

".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!

".getBytes());

}

stream.flush();

stream.close();

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

} catch (Exception e) {

e.printStackTrace();

}

}

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

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

清除数据 就是清除我们/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 file) {

if (file.isDirectory()) {

// 如果下面还有文件

File[] files = file.listFiles();

for (File f : files) {

deleteDirFile(new File(f.getPath()));

}

}

if (file.isDirectory()) {

// 目录

if (file.listFiles().length == 0) {

// 目录下没有文件或者目录,删除

file.delete();

}

} else {

// 如果是文件,删除

file.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 M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

  2. Linux 系统组成,内核发行版本,文件目录结构介绍

    1.描述计算机的组成及其功能. 组成:硬件系统和软件系统 硬件系统: 主机:中央处理器CPU(运算器.控制器),内存储器(ROM.RAM) 外设: 输出:显示器.打印机.绘图仪 输入:键盘.鼠标.扫描 ...

  3. 清空计算机网络缓存,【缓存清理工具】缓存清理软件_电脑缓存清理软件【最新】-太平洋电脑网...

    Windows7系统清理dns缓存失败解决方法介绍 在win7纯净版系统中有时候,发现网络突然变得很慢,甚至没有网络,怎么回事呢?可能是dns缓存导致的,这时候可以清理dns缓存尝试解决问题.但是有朋 ...

  4. 缓存系列 - 自己动手做缓存

    缓存设计 @author:zxw @email:502513206@qq.com @Jishou University 1. 前言 在写代码的时候缓存可以说是用的比较多了,主要还是用来缓存已经查询出的 ...

  5. android edittext 美化,android EditText的美化

    使用alloctor模板来实现string类 虽然以前做过更复杂的各种数据结构,不过那只是在看完c++prime7章后做的,没有考虑到类的拷贝体现出来是类值还是类指针,于是写了一些半成品类,不过那些主 ...

  6. 成功解决WIN系统如何更改默认放在C盘的【我的文档】/【图片】位置的存储路径(修改到其它非系统的盘符)

    成功解决WIN系统如何更改默认放在C盘的[我的文档]/[图片]位置的存储路径(修改到其它非系统的盘符) 目录 解决问题 解决思路 解决方法 解决问题 解决WIN系统如何更改默认放在C盘的[我的文档]/ ...

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

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

  8. android 根目录缓存,Android缓存策略和目录

    2016.12.22 在使用图片加载库Glide时,要让磁盘缓存到指定的目录用 DiskLruCacheFactory: 由此展开的 Android 缓存策略和目录. 一.缓存: 通俗的说就是把一些经 ...

  9. android分享图片功能实现原理,Android:简单实现并理解图片三级缓存

    学习Android网络开发的过程中,势必会经历很多痛苦的过程,其中一个大坑就是图片缓存,当然现在有很多现成的库非常方便,常常几行代码就可以实现想要的功能,但不懂其中的原理是不行的,所以对于刚开始学习网 ...

最新文章

  1. 数组作为函数的参数传参时,数组名会退化为指针
  2. Redis - 事务
  3. ubuntu12.04中shell脚本无法使用source的原因及解决方法
  4. 机器学习处理信号分离_[学习笔记]使用机器学习和深度学习处理信号基础知识...
  5. Java架构师必备框架技能核心笔记,附相关架构及资料
  6. 8 计算机组成原理第五章 中央处理器 控制器 硬布线控制器 微程序控制器
  7. 当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结
  8. selenium自动化之元素高亮显示
  9. java下高精度定时器库_高精度定时器的使用
  10. HDOJ(HDU) 1563 Find your present!(异或)
  11. 最简单AnyLogic安装教程——天津理工大学
  12. JNI详细调用(附带图文)
  13. html+css模拟京东商城登陆首页
  14. 基于android的手机位置系统,基于Android和SIM900A模块的位置实时监控系统的设计与实现...
  15. 语音信号处理疑惑与解答
  16. AD20原理图设计与PCB封装画板--学习笔记
  17. RocketMQ——ack机制保证消费成功
  18. An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
  19. 基于深度学习的车辆检测系统(MATLAB代码,含GUI界面)
  20. linux进行端口跟踪,(五)洞悉linux下的Netfilteriptables:如何理解连接跟踪机制?【上】...

热门文章

  1. 微信crm平台是什么系统?
  2. 【个人亲测】2018最流行的浏览器排行榜前10
  3. [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器
  4. 基于Hi3516DV300rtmp交叉编译移植
  5. RuntimeError: Could not find GCC executable.
  6. GNU/Linux与Windows魔兽争霸3局域网对战安装与配置
  7. 待办日程用什么软件好 2022好用的便签记事日程管理软件推荐
  8. mysql workbench 报 tables could not be fetched.
  9. ​抖音怎么养号容易热门,一机两卡养抖音号可以吗
  10. MT6765 datasheet手册,MT6765参考设计,MT6765芯片资料