安卓存储——内部存储,外部存储

1. 内部存储

内部存储空间是和应用关联的,存储在内部存储中的文件只能被应用访问到。一个应用所创建的文件都在和应用包名相同的目录下,应用被卸载后这些文件也被删除。

获取存储的方法

  1. 获取内部存储的根路径:/data
    Environment.getDataDirectory().getAbsolutePath()
  2. 某个应用在内部存储中的files路径: /data/data/com.test.sockettest/files
    getFilesDir().getAbsolutePath()
  3. 某个应用在内部存储中的cache路径: /data/data/com.test.sockettest/cache
    getCacheDir().getAbsolutePath()
2. 外部存储

最容易混淆的是外部存储,因为老的Android系统和新的Android系统是有区别的。

Android 4.4(API19)之前

  • 手机自带的存储就是内部存储,扩展的sd卡是外部存储

Android 4.4(API19)之后

  • 手机自带的存储叫做机身存储。比如有的手机是8G,有的手机是16G,这里8G,16G都叫做外部存储,那如果手机要是插了sd卡,那sd卡又叫什么呢?答案是:外部存储。
  • 在Android 4.4以后的系统中,API提供了方法来遍历手机的外部存储路径。
File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main",file);
    }
}

如果你的手机插了SD卡的话,那么它打印的路径就有两条了,例如我的华为荣耀7插了SD卡,它的结果如下:

/storage/emulated/0/Android/data/packname/files/mounted
/storage/B3E4-1711/Android/data/packname/files/mounted

/storage/emulated/0目录就是机身存储的外部存储路径,/storage/B3E4-1711就是SD卡的路径,统称为外部存储。

获取存储的方法

  1. 获取外部存储的根路径:/storage/emulated/0
    Environment.getExternalStorageDirectory()
  2. 某个应用在外部存储中的cache路径:/storage/emulated/0/Android/data/packname/cache
    getExternalCacheDir().getAbsolutePath()
    注意:4.4以前的系统中getExternalCacheDir()将返回null,因为4.4以前的系统没插SD卡的话,就没有外部存储,它的SD卡就等于外部存储;而4.4及以后的系统外部存储包括两部分,getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,也即4.4及以后的系统你不插SD卡,它也有外部存储
3. 其他问题

1. getFilesDir().getAbsolutePath()和getCacheDir().getAbsolutePath()有什么区别?

  • getFilesDir获取的是files目录, files下存放普通数据(log数据,json型数据等)

  • getCacheDir获取的是cache目录,cache下存放缓存数据

  • databases下存放使用SQLite存储的数据

  • shared_prefs下存放使用SharedPreference存放的数据

    这些文件夹都是由系统创建的。

2. 内部存储与外部存储都有APP专属文件,那么我们该使用哪个呢?
很显然应该用外部存储的,因为内部存储本身就比较小,而且已经存储了一些系统的文件,因此内部存储我们尽量不要去使用。但是当手机没有外部存储时,我们还是得使用内部存储,一般程序员会做判断是否有外部存储,没有再使用内部存储,代码如下:

public static String getFilePath(Context context,String dir) {
    String directoryPath="";
    if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {
    	//判断外部存储是否可用 
        directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
    }else{
    	//没外部存储就使用内部存储  
        directoryPath=context.getFilesDir()+File.separator+dir;
    }
    File file = new File(directoryPath);
    if(!file.exists()){
    //判断文件目录是否存在
        file.mkdirs();
    }
    return directoryPath;
}

3.清除缓存和清除数据的区别

  • 清除缓存:清除的是APP运行过程中所产生的临时数据
  • 清除数据:真正的删除了我们保存在文件中的数据,例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。
  • /data/user/0/packname/files它是用来存储普通数据的
  • /data/user/0/packname/cache它是用来存储缓存数据的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值