
基于@ohos.util.stream的web离线缓存文件加载
stream和fs.open的区别、优势:
stream | fs.open | |
简介 | 用来读取、写入、处理和传输数据,它们通常用于处理大量数据或连续的数据流,例如文件、网络传输等。 | 使用文件系统模块打开一个文件,获取文件描述符(File Descriptor),以便进行文件的低级别操作,如读取、写入、关闭等。 |
特点 |
|
|
优势 |
| |
总结 | 是一种用于处理数据的抽象接口,适合处理大量数据或连续的数据流,提供了丰富的事件和方法,用于对数据进行流式处理和操作。 | 是使用文件系统模块打开文件,获取文件描述符,以便进行底层的文件操作,需要手动管理文件描述符和数据缓冲区。 |
四种流的使用场景:
简介 | 使用场景 | |
Writable (可写流) | 可写流用于将数据写入某个目标,例如文件、网络连接等。你可以通过调用write()方法向流中写入数据,并在写完所有数据后调用end()方法。 |
|
Readable(可读流) | 可读流用于从数据源读取数据,例如文件、网络连接等。你可以监听事件(例如data事件)来获取数据块,或使用pipe()方法将数据传输到可写流或其他处理机制。 |
|
Duplex (双工流) | 双工流是既可读又可写的流。它们通常用于实现与网络协议相关的通信,因为在这些场景中,数据需要同时进行读取和写入操作。 Duplex类继承Readable,支持Readable中所有的方法。 |
|
Transform(转换流) | 转换流是一种特殊类型的双工流,在读写过程中可以修改或转换数据。转换流对于需要对数据进行修改、压缩或解压缩等操作的场景非常有用。 Transform类继承Duplex,支持Duplex中所有的方法。 |
|
场景描述
通过web加载网址,onInterceptRequest拦截资源请求,web离线缓存的文件需要通过查看/data/storage/el2/base/cache/web/Cache目录来判断是否存在离线缓存,若存在缓存使用Context.cacheDir获取文件路径后,通过pathDir路径,再使用stream进行对文件读写。
代码实现
核心类介绍:
1. 通过web加载网址,onInterceptRequest拦截资源请求, web的缓存在指定目录/data/storage/el2/base/cache/web/Cache下。
2.通过Context.cacheDir获取缓存文件的目录,根据具体具体缓存文件路径将缓存对应的压缩包通过zlib.decompressFile解压缩,并将文件解压到指定路径 outFile中。
3. 通过流读取文件里的资源。
编写读写数据流,针对读写数据流添加光标设置。在ReadStream中实现doRead方法,在doRead中通过stream.read读取文件内容并移动光标位置,在执行push方法时会自动执行doRead。在WriteStream中实现doWrite方法,在doWrite中通过stream.write将数据写入流文件中并移动光标位置,在执行write方法时会自动执行doWrite方法。
通过fs.createStreamSync创建一个文件流this.stream,在doRead方法中使用this.stream.read (注:文件流的read方法,不是可读流readStream的read 方法) 从文件流中读取文件的内容,最后使用ReadStream的push方法将this.stream.read读取的数据推送到可读流缓冲区中。后续可以通过监听data事件来读取缓冲区中的内容 (注:执行push方法时系统会自动调用doRead方法)。
通过fs.createStreamSync创建一个文件流this.stream,在doWrite方法中使用this.stream.write (注:文件流的write方法,不是可写流 WriteStream的 write方法) 将数据写入文件流中。后续可以使用WriteStream的write方法将数据写入文件流中 (注:执行write方法时系统会自动调用doWrite方法)。
最后对文件进行读写,使用on监听error事件和finish事件,来监听读写是否出错和完成,在读取过程中通过data事件来监听数据是否更新并打印输出。
