Node.js中你不可不精的Stream(流)(4)
使用fs.createReadStream()
// 流:有序的有方向的,可以自己控制速率 // 读:读是将内容读取到内存中 // 写:写是将内存或者文件的内容写入到文件内 // 读取的时候默认读 默认一次读取64k,encoding 读取出来的内容默认都是buffer //let fs = require('fs'); //let rs = fs.createReadStream({...});//原生实现可读流 let ReadStream = require('./ReadStream'); let rs = new ReadStream('./2.txt', { highWaterMark: 3, // 字节 flags:'r',//读文件 autoClose:true, // 默认读取完毕后自动关闭文件描述符 start:0, //end:3,// 流是闭合区间 包start也包end encoding:'utf8' }); // 默认创建一个流 是非流动模式(上述源码中有写的),默认不会读取数据 // 如果我们需要接收数据,那我们要监听data事件,这样数据会自动的流出来 rs.on('error',function (err) {// 通常,这会在底层系统内部出错从而不能产生数据,或当流的实现试图传递错误数据时发生。 console.log(err) }); rs.on('open',function () {//文件被打开了,获取到了fd。内部会自动的触发这个事件 rs.emit('data'); console.log('文件打开了'); }); rs.on('data',function (data) {//有数据流出来了 console.log(data); rs.pause(); // 暂停触发on('data')事件,将流动模式又转化成了非流动模式 }); setTimeout(()=>{rs.resume()},3000);//三秒钟之后再将非流动模式转化为流动模式 rs.on('end',function () {// 读取完毕 console.log('读取完毕了'); }); rs.on('close',function () {//close 事件将在流或其底层资源(比如一个文件)关闭后触发。close 事件触发后,该流将不会再触发任何事件。 //console.log('关闭') });
四、可写流(Writable Stream)
可写流是对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备,常见的是本地磁盘文件或者 TCP、HTTP 等网络响应。
常见的可写流:
- HTTP requests, on the client
- HTTP responses, on the server
- fs write streams
- zlib streams
- crypto streams
- TCP sockets
- child process stdin
- process.stdout, process.stderr
所有 Writable 流都实现了 stream.Writable 类定义的接口。
可写流的使用
调用可写流实例的 write() 方法就可以把数据写入可写流
const fs = require('fs'); const rs = fs.createReadStream(sourcePath); const ws = fs.createWriteStream(destPath); rs.setEncoding('utf-8'); // 设置编码格式 rs.on('data', chunk => { ws.write(chunk); // 写入数据 });
监听了可读流的data事件就会使可读流进入流动模式,我们在回调事件里调用了可写流的 write() 方法,这样数据就被写入了可写流抽象的设备destPath中。