NodeJs-stream流和pipe管道的使用

Stream

流是一种抽象的概念,它表示的含义是,文件的传输,就像水流一样,通过管道一点一点的传向目的地。流的背后,是一个又一个的缓冲区,提前为数据做好了准备。 比如fs模块,用它读取过文件。它的做法是把数据一次性读取到内存中,如果写入是一次性把内存中的数据写入到磁盘。如果我们读取的文件非常小,那这样做是没有问题,但是如果是大容量的文件10G,甚至更大,那么这种模型就很有问题了。 而 Stream 的理念是边读边取,用这种 IO 方式就破解了上面的难题,节省空间和时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
以流的形式读取文件
*/
var fs = require('fs');
var rs = fs.createReadStream('filename', 'utf-8') // 得到的 rs 是一个输出流句柄,通过事件触发得到它到状态

// 数据开始读取...
// data 事件可能会读取多次,每次读取一块数据
rs.on('data', function (chunk) {
console.log('DATA:')
console.log(chunk)
})

// 读完触发
rs.on('end', function () {
console.log('END')
})

// 错误触发
rs.on('error', function (err) {
console.log('ERROR: ' + err)
})


/*
以流的形式写入文件
*/
var fs = require('fs')
var ws = fs.createWriteStream('filename', 'utf-8')
ws.write('1') // 一点
ws.write('2') // 一点
ws.end() // 写入

pipe

管道是 Unix 的核心思想之一,如果你接触过 Linux 操作系统,那么对下面这个操作就很容易理解。

1
2
3
4
5
6
7
8
9
var fs = require('fs')
var rs = fs.createReadStream('a.txt') // 输出流
var ws = fs.createWriteStream('b.txt') // 输入流
rs.pipe(ws) // 输出通过管道流向输入

/*
上面做的工作,是读取 a.txt 的内容,写入到 b.txt
在 Linux 中它有一个名字,叫做 “重定向”
*/
  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2020 翟天野

请我喝杯咖啡吧~