Node.js Stream 流

Stream

是一种抽象的概念,它表示的含义是,文件的传输,就像水流一样,通过 管道 一点一点的传向目的地。流的背后,是一个又一个的 缓冲区,提前为数据做好了准备。

我们在前面小节列举过 fs模块,用它读取过文件。它的做法是把数据一次性读取到内存中,如果写入是一次性把内存中的数据写入到磁盘。如果我们读取的文件非常小,那这样做是没有问题,但是如果是大容量的文件 10G,甚至更大,那么这种模型就很有问题了。

而 Stream 的理念是 边读边取,用这种 IO 方式就破解了上面的难题,节省空间和时间。

/*
 以流的形式读取文件
*/ 
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 操作系统,那么对下面这个操作就很容易理解。

var fs = require('fs')
var rs = fs.createReadStream('a.txt') // 输出流
var ws = fs.createWriteStream('b.txt') // 输入流
rs.pipe(ws) // 输出通过管道流向输入

/* 
 上面做的工作,是读取 a.txt 的内容,写入到 b.txt
 在 Linux 中它有一个名字,叫做 “重定向”
*/
Node.js 教程 Node.js 安装 Node.js NPM Node.js 模块 Node.js HTTP Node.js 文件操作 Node.js Buffer Node.js Stream Node.js Crypto Node.js Mysql Node.js Request Node.js WebSocket
更多教程 HTML5 教程 CSS3 教程 JavaScript 教程 JQuery 教程 React.js 教程 Node.js 教程 Koa2 教程 Python 教程 Linux 教程