Android外存和内存文件目录总结简述
概述
在开发过程中,我们不可避免的会使用到存储,Android中的存储主要分为文件存储及数据库存储,本期着重于文件存储的目录整理及说明,随着Android版本及SDK版本的更新,Android的存储路径相对于比较混乱,本期做了一个简单的整理说明。
一、存储分类
Android中的存储主要分为内部存储和外部存储。
1. 内部存储
注意内部存储和内存不是一个概念,内部存储是指的你当前应用对应的特殊存储空间,是可写入存储的磁盘空间。而内存指的是memory,是运行程序时的数据载体,只用在程序运行时,不存储数据。
- 存在内部存储的文件默认情况下只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。
- 应用内创建的内部存储的文件,和文件是相关联的,当一个应用卸载之后,内部存储的这些文件也会被删除。
- 内部存储的空间十分有限,同时也是系统本身和系统应用程序主要的数据存储的所在地,一旦内部存储空间耗尽了,手机也无法使用了,所以在使用内部存储是要尽量避免使用。
- Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
1、Environment.getDataDirectory() //获取内部存储的根目录,/data
2、context.getFilesDir() // 获取应用在内部存储的file目录 /data/.../packageName/file
3、context.getCacheDir() //获取应用在内部存储的cache目录 /data/.../packageName/cache
2. 外部存储
外部存储是大家容易搞混的一个概念,原因是由于机身本身的存储在Android4.4之前表示的是内部存储,在Android4.4之后由于手机机身存储的增加,因此在4.4之后,系统在概念上将手机本身的存储划分为了内部存储及外部存储两个方面。
因此外部存储既包括扩展的SD卡存储,也包括手机本身的机身存储(仅限于Android4.4之后),为了更好的区分机身存储上的内部存储及外部存储的概念,SDK提供了如下的方法来查询手机的外部存储路径(API 19之后):
var file:Array<File> = applicationContext.getExternalFilesDirs(Environment.MEDIA_MOUNTED)
逐个打印上面的Array里面的路径,可以得到所获得所有外存路径,其中目录为/storage/emulated/0
目录就是机身存储的外部存储路径,另外的路径就是SD的存储路径了。
访问外存的常见API方法如下:
Environment.getExternalStorageDirectory() //获取外部存储的根目录 /storage/emulated/0
context.getExternalFilesDir("") //获取应用在外部存储的文件目录 /storage/emulated/0/..../packageName/file
context.getExternalCacheDir() //获取应用在外部存储的cache目录 /storage/emulated/0/..../packageName/cache
需要注意的是,在4.4版本之后,上述三个方法获取的均是机身外存的目录,如果需要查找SD卡的路劲,请使用上述的getExternalFilesDirs
方法去获取SD卡路径。
3. 其他API
Environment.getDownloadCacheDirectory() 获取下载缓存路径, /cache
Environment.getRootDirectory() 获取系统存放文件的目录,/system
还有额外的两个获取路径的方法,这两个方法本人使用的较少,从结果上来看,前者用来存放cache文件,后者是用来存放系统文件,两者均属于内部存储。其他尚不清楚,待后续学习补充。
4. 清除数据及缓存
在手机的应用管理上存在功能叫做删除数据和清空缓存,很多人容易错认为清除数据和清除缓存这两项功能删除的数据和文件的目录有关,但其实是没有什么关系的,具体结果如下:
清除缓存:清除缓存并不是去清空cache目录下的文件,而是清空APP运行时的临时数据文件,存在在内存中,共app调用。
清除数据:清除数据是指清空应用目录下的保存的文件,不区分内部存储还是外部存储,是在应用目录下的文件都会删除,既/storage/emulated/0/..../packageName
和/data/.../packageName
目录下的文件都会删除,不区分cache目录还是file目录还是其他目录,都会删除。
二、获取机身的剩余存储空间
搞清楚了上面的目录分类,下面我们说下有关于手机存储空间获取的问题,即获取到指定目录的空间大小。
获取空间大小的代码如下:
private long getAvailSD() {
try {
//首先指定需要获取大小的目录
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
//得到可用区块
long availableBlocks = stat.getAvailableBlocks();
//得到全部区块
// long availableBlocks = stat.getBlockCount();
long availsd = blockSize * availableBlocks;
return availsd;
} catch (Exception e) {
}
return -1;
}
得到大小之后可以通过调用如下方法使获取的大小标准的显示出来。
Formatter.formatFileSize(context, localSize)
总结
目前在文件目录上遇到了上述两个问题,查阅资料后进行了简单总结,后续遇到其他问题再进行陆续补充。