存储

目录

  • 存储方案

  • 缓存路径

  • 缓存算法

  • 缓存案例

存储方案

内存缓存和磁盘缓存(LruCache和DiskLruCache) 参考:Android DiskLruCache完全解析,硬盘缓存的最佳方案

  • 文件存储

  • SP私有存储(Shared Preferences)

  • 数据库存储(Sqlite)

  • 网络存储

内部存储

注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。

外部存储

缓存路径

  • getCacheDir()

    方法用于获取/data/data/<application package>/cache目录
  • getFilesDir()

    方法用于获取/data/data/<application package>/files目录
  • getExternalFilesDir()

    方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据

  • getExternalCacheDir()

    方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

//获取缓存目录

public String getDiskCacheDir(Context context) {  
    String cachePath = null;  
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
            || !Environment.isExternalStorageRemovable()) {  
        cachePath = context.getExternalCacheDir().getPath();  
    } else {  
        cachePath = context.getCacheDir().getPath();  
    }  
    return cachePath;  
}  

文件路径: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /cache Environment.getExternalStorageDirectory() = /mnt/sdcard Environment.getExternalStoragePublicDirectory(“test”) = /mnt/sdcard/test Environment.getRootDirectory() = /system getPackageCodePath() = /data/app/com.my.app-1.apk getPackageResourcePath() = /data/app/com.my.app-1.apk getCacheDir() = /data/data/com.my.app/cache getDatabasePath(“test”) = /data/data/com.my.app/databases/test getDir(“test”, Context.MODE_PRIVATE) = /data/data/com.my.app/app_test getExternalCacheDir() = /mnt/sdcard/Android/data/com.my.app/cache getExternalFilesDir(“test”) = /mnt/sdcard/Android/data/com.my.app/files/test getExternalFilesDir(null) = /mnt/sdcard/Android/data/com.my.app/files getFilesDir() = /data/data/com.my.app/files

权限变化

从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。

从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。

从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。

缓存路径选择方案

其实DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data//cache 这个路径。选择在这个位置有两点好处:第一,这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题。

Last updated

Was this helpful?