前言

之前在讲WebView缓存时有讲过一种DomStorage缓存方式。这篇文章就详细讲一下这个缓存机制,虽然这个跟web端的关系大一些,也就当作一次知识拓展吧!


webStorage

在html5中DomStorage称为webStorage。
其相关api有:

    setItem (key, value) ——  保存数据,以键值对的方式储存信息。

    getItem (key) ——  获取数据,将键值传入,即可获取到对应的value值。

    removeItem (key) ——  删除单个数据,根据键值移除对应的信息。

    clear () ——  删除所有的数据

    key (index) —— 获取某个索引的key

其类型可分为:sessionStorage和localStorage两种。


localStorage

localStorage的生命周期是永久性的。假若使用localStorage存储数据,即使关闭浏览器,也不会让数据消失,除非主动的去删除数据,使用的方法如上所示。localStorage有length属性,可以查看其有多少条记录的数据。使用的方法也很简单:

  • storage = window.localStorage; ——先获取localStorage的对象
  • storage.setItem("name", "Rick"); ——调用setItem方法,使用key-value的形式存储数据
  • storage.getItem("name"); ——调用getItem方法,获取对应key值的数据
  • storage.removeItem("name"); ——调用removeItem方法,移除对应key值的数据

以上就是localStorage的基本用法了。注意!以上的是js代码


sessionStorage

sessionStorage 的生命周期是在浏览器关闭前。也就是说,在整个浏览器未关闭前,其数据一直都是存在的。sessionStorage也有length属性,其基本的判断和使用方法和localStorage的使用是一致的。
主要的特点是:

  • 页面刷新不会消除数据
  • 只有在当前页面打开的链接,才可以访sessionStorage的数据
  • 使用window.open打开页面和改变localtion.href方式都可以获取到sessionStorage内部的数据

以上就是webStorage的基本介绍了,以下链接有比较详细的介绍:LocalStorage和sessionStorage之间的区别


Environment.getExternalStorageDirectory()究竟是哪里,以及它与getExternalFilesDir()的区别

上次讲WebView缓存的时候有用到Environment.getExternalStorageDirectory()来获取应用的外部存储路径。这里插一个题外话,其实不完全是WebView,所有关于文件读写的操作都需要获取到应用的内存地址。这个在做相机拍照、录像的时候也时常碰到的问题,就是到底Environment.getExternalStorageDirectory()是在哪里呢?
ExternalStorageDirectory:故名思义就是外部存储。说到外部存储我们的第一反应就是外置的SD卡。其实我刚开始做开发的时候也有过一些疑惑,因为现在大部分手机都不存在SD卡这个概念了,那会不会导致这个方法出现异常呢?其实是不会的。这里的外部存储是相对于手机本身的存储空间而言的。什么意思呢?其实大概就分为两种情况:

  • 第一种就是以前旧版本的手机可以插外置SD卡的,这一类手机的ExternalStorageDirectory一般会认为是这张SD卡的区域。
  • 第二种就是我们现在比较常见的无外置SD卡内置大容量的手机了。这部分的手机硬件一般会将手机容量分出一部分空间用于安装手机系统,而剩余的一般就是所谓的ExternalStorageDirectory(大概就是它们在这个内置内存中划分了很大一部分区间作为所谓的外部存储空间)。所以说即使一台256G的手机真正可以给用户自由分配的空间也必然会比256G少。

综合以上两种情况可以得知其实ExternalStorageDirectory只是一个相对的概念,而不是我们经常所说的外置SD卡。以下是Google官方文档的解释:
don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer
其意思就是这个目录可以更好地被认为是媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并在所有应用程序之间共享(不强制执行权限)。传统上,这是一个SD卡,但它也可以被实现为与被保护的内部存储区不同的设备中的内置存储,并且可以作为文件系统安装在计算机上。
简单一点理解就是其实Android手机也可以作为U盘来存储数据嘛。所以它本身其实也可以看作是一张SD卡。


getExternalStorageDirectory()与getExternalFilesDir()

  • 上面说到了ExternalStorageDirectory是一个在所有应用之间共享的文件系统,那么他的路径就必然是相对于其他应用独立的。也就是说在其路径下保存的文件可以对其他应用共享。

我们可以获取ExternalStorageDirectory的路径

File sdCard = Environment.getExternalStorageDirectory();
Log.i(TAG,sdCard);

打印出来的路径为

/mnt/sdcard
  • 再来说说getExternalFilesDir()。之前说过ExternalStorageDirectory是相对应用独立的文件路径,有独立就会私用的概念,也就是应用专属的文件。其路径一般会在应用的包目录下:

    /Android/data/< package name >/files/

我们可以通过getExternalFilesDir(null)查找到上面提到对应应用的files目录。
如果需要查找files下对应的目录,可以将所查找的目录名作为字符串传入方法中:
如我需要查找files下的Cache目录,getExternalFilesDir("Cache")

标签: Android WebView

添加新评论