Android 存储路径详解

概述

我们先来考虑这样一个问题:

打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?读完本文相信你会有答案。

在android开发中我们常常听到这样几个概念,内存,内部存储,外部存储。很多人常常将这几个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事?

内存,我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储我们称为ExternalStorage,这在英文中本不会产生歧义,但是当我们翻译为中文之后,前两个都简称为内存,于是,混了。

那么究竟什么是内部存储,什么是外部存储呢?


补充内容:绝对路径和相对路径

绝对路径:指书写文件的完整路径,例如d:\java\Hello.java,该路径中包含文件的完整路径d:\java以及文件的全名Hello.java。使用该路径可以唯一的找到一个文件,不会产生歧义。但是使用绝对路径在表示文件时,受到的限制很大,且不能在不同的操作系统下运行,因为不同操作系统下绝对路径的表达形式存在不同。

相对路径:指书写文件的部分路径,例如\test\Hello.java,该路径中只包含文件的部分路径\test和文件的全名Hello.java,部分路径是指当前路径下的子路径,例如当前程序在d:\abc下运行,则该文件的完整路径就是d:\abc\test。使用这种形式,可以更加通用的代表文件的位置,使得文件路径产生一定的灵活性。

在Eclipse项目中运行程序时,当前路径是项目的根目录,例如工作空间存储在d:\javaproject,当前项目名称是Test,则当前路径是:d:\javaproject\Test。在控制台下面运行程序时,当前路径是class文件所在的目录,如果class文件包含包名,则以该class文件最顶层的包名作为当前路径。


这是java在多数操作系统中这样操作,很显然是要我们尽可能的使用相对路径,但是在安卓中,其实多数情况下我们都是使用的绝对路径。

为什么呢?

注意上面说到相对路径是以当前项目所在路径为当前路径,但在安卓中我们是不可能在项目所在路径目录下做任何操作的,因为普通java中我们的项目创建于服务器(pc也算是服务器),运行于服务器,我们当然能在服务器操作自己的文件目录。

但是安卓开发中,我们的项目一般是创建于自己工作的电脑,而运行于手机,既然apk已经运行于手机了,那项目就已经部署到手机上了,应该以apk在手机上的位置来确定相对路径,但我们好像们没有办法操作这个路径的,因为apk是在system目录下,就算可以操作,在这个目录下存取文件也是没有意义的。

比如我写一个相册程序,图片肯定是放在外部存储中,而如果我要保存一个应用的一些设置数据,我是放在内部存储的data目录下,因此其实在安卓文件管理中,我们都是在操作绝对路径。


内部存储


注意内部存储不是内存。

Android手机root后,可以看到内部存储,路径为“/data/data/应用包名” 如下图所示:
这里写图片描述

内部存储有以下特点:

以应用包名创建文件夹;

应用卸载,随之被删除;

Shared Preferences文件,SQLite数据库都存储于此;

一般用Context来获取和操作。

外部存储


最容易混淆的是外部存储,因为不管是手机自带的存储(比如现在手机32G、64G、128G版本),还是插入的SD卡,都称为外部存储。

现在Android SDK提供的API只能访问到手机自带的外部存储,不能访问到插入的SD卡,如需访问插入的SDK,需要用到反射等方式调用SDK中隐藏的方法。如有需要,请自行去搜索。


通过Environment.getExternalStorageDirectory().getPath()方法,可获得外部存储根目录。
获取的结果可能为(因为不同的Android手机可能会有差异):
/storage/emulated/0

外部存储也有2种:

公共文件(Public files):文件是可以被自由访问,且文件的数据对其他应用或者用户来说都是有意义的,当应用被卸载之后,其卸载前创建的文件仍然保留。比如camera应用,生成的照片大家都能访问,而且camera不在了,照片仍然在。


私有文件(Private files):其实由于是外部存储的原因即是是这种类型的文件也能被其他程序访问,只不过一个应用私有的文件对其他应用其实是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在于卸载之后,这些文件也会被删除。类似于内部存储。

外部存储私有文件的目录为:context.getExternalFilesDir(null).getPath()。
比如:/storage/emulated/0/Android/data/chapter2.zcw.com.chapter2/files

总结

Android系统本身,提供了一系列访问存储路径的方法,可根据需要获取相应的目录

Log.e(TAG, "Environment.getDataDirectory().getPath() = " + Environment.getDataDirectory().getPath());
Log.e(TAG, "Environment.getDownloadCacheDirectory().getPath() = " + Environment.getDownloadCacheDirectory().getPath());
Log.e(TAG, "Environment.getExternalStorageDirectory().getPath() = " + Environment.getExternalStorageDirectory().getPath());
Log.e(TAG, "Environment.getExternalStoragePublicDirectory(\"test\").getPath() = " + Environment.getExternalStoragePublicDirectory("test").getPath());
Log.e(TAG, "Environment.getRootDirectory().getPath() = " + Environment.getRootDirectory().getPath());

Log.e(TAG, "getFilesDir().getPath() = " + getFilesDir().getPath());
Log.e(TAG, "getExternalFilesDir(\"test\").getPath() = " + getExternalFilesDir("test").getPath());

结果如下图所示:
这里写图片描述

不同手机上,获取到的结果可能会有出入。



参考资料: 彻底理解android中的内部存储与外部存储

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值