node 核心内置类库2 :Stream和Stream的writable示例

//有哪些常用的Stream,分别什么时候使用
//参考答案:
// Readable为可被读流,在作为输入数据源时使用;
// Writable为可被写流,在作为输出源时使用;
// Duplex为可读写流,它作为输出源接受被写入,同时又作为输入源被后面的流读出.
// Transform机制和Duplex一样,都是双向流,
// 区别是Transfrom只需要实现一个函数_transfrom(chunk, encoding, callback);
// 而Duplex需要分别实现_read(size)函数和_write(chunk, encoding, callback)函数.

//实现一个 writable Stream.
//1.构造函数call Writable
//2.继承Writable
//3.实现_write(chunk,encoding,callback)函数
//代码演示:
var Writable = require('stream').Writable;
var util = require('util'); 

function MyWritable(option) {
    Writable.call(this,option);
}

util.inherits(MyWritable, Writable)//继承

MyWritable.prototype._write = function(chunk, encoding, callback) {
    console.log("被写入的数据是:", chunk.toString()); // 此处可对写入的数据进行处理
    callback();
};

//通过管道将输入定位到输出 , Stream通过pipe方法控制流向.
process.stdin.pipe(new MyWritable()); // stdin作为输入源,MyWritable作为输出源

//运行后,控制台输入11233,控制台输出11233

1.可写流使用

const fs = require('fs');
const rs = fs.createReadStream('./w.js');  //创建可读流
const ws = fs.createWriteStream('./copy.js'); //创建可写流

rs.setEncoding('utf-8');
//监听了可读流的 data 事件就会使可读流进入流动模式
rs.on('data', chunk => {
    ws.write(chunk); //将监听到的可读流的数据 写入 可写流(copy.js)中。
});

2.自定义可写流

const Writable2 = require('stream').Writable

class OutputStream extends Writable2 {
    _write(chunk, enc, done) {
        // 转大写之后写入标准输出设备
        process.stdout.write(chunk.toString().toUpperCase());
        // 此处不严谨,应该是监听写完之后才调用 done
        process.nextTick(done);
    }
}

//process.stdin.pipe(new OutputStream());//测试代码,是否进行了大小写转换
process.stdin.pipe(new OutputStream({ highWaterMark: 8 // 把水位降低,默认16k还是挺大的
}));
module.exports = OutputStream;

有了可写流的类之后我们可以实例化使用了,实例化可写流的时候有几个 option 可选,了解一下可以帮助我们理解后面要用的知识
•objectMode 默认是 false, 设置成 true 后 writable.write() 方法除了写入 string 和 buffer 外,还可以写入任意 JavaScript 对象。很有用的一个选项,后面介绍 transform 流的时候详细介绍
•highWaterMark 每次最多写入的数据量, Buffer 的时候默认值 16kb, objectMode 时默认值 16
•decodeStrings 是否把传入的数据转成 Buffer,默认是 true

猜你喜欢

转载自blog.csdn.net/baidu_19552787/article/details/87711313