Node.js Stream 文件流
如果我们要读取一个很大的文件,无论采用同步或者异步的方式都是一次性得到结果。如果我们把文件拆分为很多小的信息块,无论用同步或者异步的方式都是读取实现不了的,但通过文件流就可以实现这个功能。采用文件流读取大文件内容,还可以节省内存。
Stream 是一个抽象接口,Node.js 中有很多对象实行了这个接口。例如对 http 服务器发起请求的 request 对象就是一个 Stream ,还有 stdout(标准输出)。所有的 Stream 对象都是 EventEmitter 是实例,常用的事件有:
- data 当有数据可读时触发
- end 没有数据时触发
- error 发生错误时触发
- finish 所有数据已被写入到底层系统时触发
文件输入流
导入 fs 模块,然后定义一个 data 变量用于存放读取的结果,因为文件流的读取是一段段的读取。使用 fs 中 createReadStream API 对文件进行读取,在处理大文件时候可以用到,例如处理日志文件。然后使用 setEncoding 设置字符集。使用 on 监听 Stream 的 data 事件,不断的往 data 中添加更新内容。
- createReadStream
let fs = require('fs');
let data = '';
let readerStream = fs.createReadStream(__dirname + '/test.txt);
readerStream.setEncoding('UTF8');
readerStream.on('data', function(chunk){
data += chunk
})
readerStream.on('end', function(){
console.log(data)
})
readerStream.on('error', function(error){
console.log(error)
})
文件输出流
- createWriteStream
- writerStream.write
- writerStream.end
let fs = require('fs');
let data = '';
let writerStream = fs.createWriteStream(__dirname + '/test.txt);
writerStream.write('Hello world');
writerStream.end();
writerStream.on('finish', function(){
console.log('写入完成')
})
writerStream.on('error', function(error){
console.log(error.stack)
})