1.前言
在Android 开发中,存储肯定是必不可缺少的,很多开发同学对于调用一些诸如getFilesDir,getExternalStorageDirectory方法的时候并不清楚他的数据到底存在了哪里,下面详细的介绍下不同的方法的存储位置及外部存储和内部存储概念讲解
2.外部存储和内部存储
内部存储
概念:注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
**外部存储 **
概念:在4.4(API19)之前的版本存在sd卡的时候,机身内存就是内部存储,外置的sd卡就是外部存储,而在4.4之后,手机的机身存储分成了内部存储和外部存储两个部分,一般的文件都是存储在外部存储根目录下获取在android目录下,主要讲解的方法也是针对4.4之后的;
3.获取存储路径方法
内部存储(internal storage)
getCacheDir()方法用于获取/data/data//cache目录
getFilesDir()方法用于获取/data/data//files目录
外部存储(external storage)
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
通过Environment.getExternalStorageDirectory()方法可以获取到外部存储的根目录,SD根目录:/mnt/sdcard/ (6.0后写入需要用户授权),一般不建议使用
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。
针对五种方法打印路径如下:
com.example.fang.test E/getFilesDir(): /data/user/0/com.example.fang.test/files/aa
com.example.fang.test E/getCacheDir(): /data/user/0/com.example.fang.test/cache/aa
com.example.fang.test E/getExternalFilesDir(): /storage/emulated/0/Android/data/com.example.fang.test/files/aa
com.example.fang.test E/getExternalCacheDir(): /storage/emulated/0/Android/data/com.example.fang.test/cache/aa
com.example.fang.test E/StorageDirectory(): /storage/emulated/0/aa
谷歌官方推荐使用外部存储getExternalCacheDir,getExternalFilesDir的这两个路径,不需要申请存储权限,卸载之后,会一并删除,不会留下垃圾文件;
4 .使用方法
/**
* 不需要申请存储权限 获得外部存储文件地址。
*
* @return
*/
public static String getFileDir(String path) {
String fileDir;
if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {//判断外部存储是否可用
fileDir = CKghApp.getSelf().getApplicationContext().getExternalFilesDir(null).getAbsolutePath()
+ path;
File externaleFile=new File(fileDir);
if (!externaleFile.exists()) {
externaleFile.mkdirs();
}
} else {
fileDir = CKghApp.getSelf().getFilesDir().getAbsolutePath() + path;
}
return fileDir;
}
5.清除缓存和清除数据
清除缓存:我们知道应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据和外部存储/Android/data/你的应用的包名/files/ 目录 目录下的文件。
清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。