Node核心模块 之 Stream流

2019-01-13  本文已影响9人  风之化身呀

引言

流可以看成数据块,比如要处理一个文件,我们首先需要将文件读入到内存中,如果这个文件很大,那么读入时间就会很长。流可以解决这类问题,使用流可以一次读取一点,直到读完为止,例如以下实例:

// 方案A
var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    fs.readFile(__dirname + '/data.txt', function (err, data) {
        res.end(data);
    });
});
server.listen(8000);

/// 方案B
var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    var stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});
server.listen(8000);

流模块基础

在node中,一共有五种类型的流:readable,writable,transform,duplex以及"classic"

src.pipe(writableStream)

只需要定义一个._write(chunk,enc,next)函数,你就可以将一个readable流的数据释放到其中。chunk代表写进来的数据,enc代表编码的字符串,但是只有在opts.decodeString为false的时候你才可以写一个字符串,next(err)是一个回调函数,使用这个回调函数你可以告诉数据消耗者可以写更多的数据。你可以有选择性的传递一个错误对象error,这时会在流实体上触发一个emit事件

var fs = require('fs');
var zlib = require('zlib');

var gzip = zlib.createGzip(); // 返回 transform 流

var inFile = fs.createReadStream('./extra/fileForCompress.txt');
var out = fs.createWriteStream('./extra/fileForCompress.txt.gz');

inFile.pipe(gzip).pipe(out);
// 服务端
var net = require('net');
var opt = {
    host: '127.0.0.1',
    port: '3000'
};

var server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log('client send message: ', data.toString());
    });
    socket.write('hello client');
});
server.listen(opt.port, opt.host, ()=>{
    console.log(server.address());
});

// 客户端
var net = require('net');
var opt = {
    host: '127.0.0.1',
    port: '3000'
};

var client = net.connect(opt, function(){
    client.write('msg from client');  // 可写
});

// 可读
client.on('data', function(data){
    console.log('client: got reply from server [%s]', data);
    client.end();
})

流事件

// 消费可读流的常用两种方式:pipe 和 监听data事件
const read = fs.createReadSream('./text.text');
// pipe
read.pipe(process.stdout)
// 监听data事件
read.on('data',function(chunk){
      console.log(chunk)
})
read.on('end',function(){
      console.log('end')
})
const write = fs.createWriteStream('./a.txt');
write.write('abc');
write.end()

参考:

1、stream-handbook的完整中文版本
2、Stream

上一篇 下一篇

猜你喜欢

热点阅读