1.什么是流

概念

流是指数据的流动,数据从一个地方缓缓的流动到另一个地方

分类

流是有方向的(不同的语言的叫法是不同的,例如java中叫输入流和输出流)

可读流(Readable)

数据从源头流向内存

可写流(Writable)

数据从内存流向源头

双工流(Duplex)

数据即可从源头流向内存又可从内存流向源头

2.为什么需要流

其他介质和内存的数据规模不一致

JavaScript 文件流 下载zip_数据

 

其他介质和内存的数据处理能力不一致

JavaScript 文件流 下载zip_文件流_02

 

3.什么是文件流

内存数据和磁盘文件数据之间的流动

4.文件流的创建

1. fs.createReadStream(path[, options])

1. 含义
创建一个文件可读流,用于读取文件内容
2. path
读取的文件路径
3. options
可选配置对象
3.1 encoding:编码方式
3.2 start:起始字节
3.3 end:结束字节
3.4 highWaterMark:每次读取数量
①如果encoding有值,该数量表示一个字符数,例如:一个汉字字符占3个字节
②如果encoding为null,该数量表示字节数
3.5 autoClose :默认为true,读完自动关闭
4. 返回:Readable的子类ReadStream
4.1 事件:rs.on(事件名, 处理函数)
4.1.1 open
文件打开事件,文件被打开后触发
4.1.2 error
发生错误时触发
4.1.3 close
文件被关闭后触发
4.1.4 data
读取到一部分数据后触发

注册data事件后,才会真正开始读取

4.1.5 end
所有数据读取完毕后触发
4.2 rs.pause()
暂停读取, 会触发pause事件
4.3 rs.resume()
恢复读取,会触发resume事件
4.4 rs.close()

2. fs.createWriteStream(path[, options])

1. 含义
创建一个写入流
2. path
写入的文件路径
3. options
flags:操作文件的方式。 w:覆盖 ,a:追加
encoding:编码方式
start:起始字节
highWaterMark:每次最多写入的字节数
autoClose :默认为true,写完自动关闭
4.返回:Writable的字类WriteStream
4.1 ws.on(事件名, 处理函数)
4.1.1 open
4.1.2 error
4.1.3 close
4.2 ws.write(data)
写入一组数据,data可以是字符串或Buffer
返回一个boolean值,true:写入通道没有被填满,接下来的数据可以直接写入,无须排队。false:写入通道目前已被填满,接下来的数据将进入写入队列

JavaScript 文件流 下载zip_数据_03

 

JavaScript 文件流 下载zip_前端_04

 背压问题:因为写入队列是内存中的数据,是有限的

当写入队列清空时,会触发drain事件
4.3 ws.end([data])
data是可选的,表示关闭前的最后一次写入

3.rs.pipe(ws)

将可读流连接到可写流
可解决背压问题