File继承自Blob,File实际上没有slice方法,它从Blob获得此方法。文件只添加了几个元数据属性。
将Blob(或文件)视为指向数据的指针是最好的方式,而不是实际的数据本身。有点像其他语言中的文件句柄。
实际上,如果不使用读取器就无法访问Blob中的数据,读取器异步读取以避免阻塞UI线程。
Blobslice()方法只是返回另一个Blob,但同样,这不是数据,它只是指向原始Blob中某个数据范围的指针,有点像指向视图的有界指针。要从分片的Blob中实际获取字节,您仍然需要使用读取器。在切片blob的情况下,您的阅读器是有界的。
这实际上只是为了方便,这样你就不必在代码中携带一堆相对和绝对偏移量,你可以只获得数据的有界视图,并像从字节0读取一样使用阅读器。
在XMLHttpRequest的情况下(假设浏览器支持较新的接口),数据将在发送时流式传输,并受blob的限制。基本上,它的工作方式与发送一个指向流方法的文件指针时的工作方式相同(这基本上是在幕后进行的)。
从本质上讲,它是一个懒惰的阅读器。如果blob已经从文件系统加载/读取,或者是在内存中创建的,它将直接使用它。但是,当你使用一个文件时,它会被延迟加载并异步地流出主线程。
这里的基本逻辑是,浏览器开发人员永远不会希望读取同步发生,因为它可能会阻塞主线程,因此所有的API都是围绕这一核心原理设计的。注意Blob.slice()是如何同步的-这就是你如何知道它实际上并没有做任何IO,它只是设置了界限和(可能的)文件指针。
因篇幅问题不能全部显示,请点此查看更多更全内容