Stream(流)
是 Node.js 中处理流式数据的抽象接口。 stream 模块用于构建实现了流接口的对象。服务器
Node.js 提供了多种流对象。 例如,对 HTTP 服务器的request请求
和 process.stdout
(标准输出), 都是流的实例。ui
流能够是可读的、可写的、或者可读可写的。 全部的流都是 EventEmitter 的实例。code
1. Readable - 可读的流(fs.createReadStream()) 2. Writable - 可写的流(fs.createWriteStream()) 3. Duplex - 可读可写的流(net.Socket) 4. Transform - 操做被写入数据,而后读出结果。
全部的 Stream 对象都是 EventEmitter 的实例。经常使用的事件有:orm
data - 当有数据可读时触发 end - 没有更多的数据可读时触发 error - 在接收和写入过程当中发生错误时触发 finish - 全部数据已被写入到底层系统时触发
把文件 data.txt 中的内容复制到 copy.txt:server
const fs = require('fs') const path = require('path') const fileName1 = path.resolve(__dirname, 'data.txt') const fileName2 = path.resolve(__dirname, 'copy.txt') // 建立一个可读流, 读取原文件的 stream 对象 const readStream = fs.createReadStream(fileName1) // 建立一个可写流, 写入文件的 stream 对象 const writeStream = fs.createWriteStream(fileName2, { flags: 'a' // a 表示追加写入, 若是须要覆盖写入,则用 'w' }) // 管道读写操做 // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中 readStream.pipe(writeStream) // 逐渐的打印被读取的文件, 直到所有读取完成 readStream.on('data', chunk => { console.log(chunk.toString()) }) // 读取完成后执行 readStream.on('end', () => { console.log('所有复制完成') })
例如文件 data.txt 放在服务端,经过 get 请求读取:对象
const http = require('http') const fs = require('fs') const path = require('path') const fileName1 = path.resolve(__dirname, 'data.txt') const server = http.createServer((req, res) => { if (req.method === 'GET') { const readStream = fs.createReadStream(fileName1) readStream.pipe(res) } }) server.listen(3333)