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它是用来存储缓存数据的