创建自己的流

创建一个Writable Stream

const {Writable} = require("stream")

const outStream = new Writable({
    write(chunk, encoding, callback) {
        console.log(chunk.toString())
        callback()
    }
})
// process.stdin用户输入的的stream
process.stdin.pipe(outStream)
// 上面等价于下面
// process.stdin.on('data', (chunk)=> {
//     outStream.write(chunk)
// })
  • 保存文件为 writable.js 然后用node 运行
  • 不管你输入什么,都会得到相同的结果

创建一个Writable Stream

const {Readable} = require("stream");

const inStream = new Readable();
inStream.push("ABCDEFGHIJKLM");
inStream.push("NOPQRSTUVWXYZ");

inStream.push(null); // No more data 没有数据了
// 在数据写好后读数据
inStream.on('data', (chunk) => {
    process.stdout.write(chunk)
    console.log('写数据了')
})
// 等同上面
// inStream.pipe(process.stdout);
  • 保存文件为 writable.js 然后用node 运行
  • 不管你输入什么,都会得到相同的结果

改进

const {Readable} = require("stream");

const inStream = new Readable({
    read(size) {
        const char = String.fromCharCode(this.currentCharCode++)
        this.push(char);
        console.log(`推了 ${char}`)
        if (this.currentCharCode > 90) { // Z
            this.push(null);
        }
    }
})

inStream.currentCharCode = 65 // A
// 别人调用read读数据才推数据
// process.stdout标准输出事件
inStream.pipe(process.stdout)
  • 保存文件为 readable2.js然后用 node 运行
  • 这次的数据是按需供给的,对方调用read我们才会给一次数据

Duplex Stream

const {Duplex} = require("stream");
const inoutStream = new Duplex({
    write(chunk, encoding, callback) {
        console.log(chunk.toString());
        callback();
    },

    read(size) {
        this.push(String.fromCharCode(this.currentCharCode++));
        if (this.currentCharCode > 90) {
            this.push(null);
        }
    }
})
inoutStream.currentCharCode = 65;
process.stdin.pipe(inoutStream).pipe(process.stdout);

Transform Stream

const { Transform } = require("stream");

const upperCaseTr = new Transform({
    transform(chunk, encoding, callback) {
        this.push(chunk.toString().toUpperCase());
        callback();
    }
});

// process.stdin输入事件的数据调用upperCaseTr方法把小写转化为大写,再通过process.stdout输出
process.stdin.pipe(upperCaseTr).pipe(process.stdout);

你可能感兴趣的:(创建自己的流)