之前介绍了fs模块的文件可读流,本节继续介绍fs模块的文件可写流。
fs.WriteStream继承了stream.Writable,并重写了_write方法,实现了文件可写流
我们一般通过fs.createWriteStream来创建一个文件可写流对象。
目录
创建文件可写流对象
使用文件可写流对象
文件可写流的常用事件
open事件
error事件
finish事件
close事件
drain事件
const fs = require('fs') const path = require('path') const ws = fs.createWriteStream(path.join(__dirname, 'test.txt'), { fd: null, flags: 'r+', mode: 438, encoding: 'utf-8', start: 0, autoClose: true, highWaterMark: 2 })
fs.createWriteStream方法有两个参数,path和options
path就是要被写入数据的文件的路径
options就是可写流对象的一些参数
参数作用:
1、打开文件(打开文件,需要指定path或options.fd,options.flags,options.mode,options.encoding)
2、写入数据(写入数据的位置信息,从文件哪里开始start写入)
3、关闭文件(当写入完毕后,是否需要自动关闭文件autoClose)
还有可写流对象缓冲区的水位线highWaterMark
文件可写流的作用主要就是向文件中写入数据,写入数据的方式就是使用可写流的内置方法write和end。
其中write用于写入数据,end也可用于写入数据,但是其根本作用是通知可写流对象写入结束。
创建可写流对象的同时就会打开文件,而打开文件就会触发可写流对象的open事件
监听open事件的主要作用就是获取文件描述符fd
当可写流对象创建或使用过程中发生任何异常时,都会触发error事件,我们一般监听error事件来处理异常情况
当ws.end方法执行后,表示可写流对象停止写入了,此时表示写入结束,会触发finish事件
当可写流对象写入结束(即end方法执行),且autoClose为true时(即表示自动关闭文件时),就会触发close事件
end执行和autoClose为true,二者缺一都不会触发close事件
需要注意的是,我们无论是文件可写流的open事件,还是close事件,其实目标都不是文件本身,而是更多关注的是可写流对象。
即如果我们自己使用fs.close(fd)来关闭文件,无法触发文件可写流的close事件
drain事件是可写流独有的事件,它的触发时机是,当可写流对象缓冲区数据量超过了highWaterMark水位线(state.needDrain被置为true),之后缓冲区数据被消费清空后,就会触发drain事件。
drain事件通常不会单独使用,通常是在生产者生产速度 快于 消费者消费速度时,作为报警器来提示生产者停止生产用的。
而drain事件正是协同生产速度和消费速度的背压机制的核心。
下面一节,我们来介绍背压机制。