Stream和文件读写
- 事实上Node中很多对象是基于流实现的:
- http模块的Request和Response对象;
- process.stdout对象;
- 官方:另外所有的流都是EventEmitter的实例:
- Node.js中有四种基本流类型:
- Writable:可以向其写入数据的流(例如 fs.createWriteStream())。
- Readable:可以从中读取数据的流(例如 fs.createReadStream())。
- Duplex:同时为Readable和的流Writable(例如 net.Socket)。
- Transform:Duplex可以在写入和读取数据时修改或转换数据的流(例如zlib.createDeflate())
Readable
- 传统的读取方式
fs.readFile("./bar.txt", (err, data), err => console.log(data)
会出现很多问题,例如:文件过大、读取的位置、结束的位置、一次性读取的大小
createReadStream
- 使用
const read = fs.createReadStream('./bar.txt', {
start: '1',
end: '5',
highWateMark: 2
});
read.on('data', (data) => {
console.log(data);
// 暂停 数据流
read.pause();
// 开启 流
setTiemout(() => {
read.resume();
})
})
* `start` 开始位置
* `end` 结束为止
* `highWaterMark` 一次性读取字节的长度,默认是64kb
Writable
- 传统的写入方式
fs.writeFile("foo.txt", "content", err=> console.log(err))
不能做到一点点写入内容、精确每次写入位置
createWriteStream
(更多参数,参考官网)
const write = createWriteStream('./bar.txt',{
flag: 'r+',
start: 4
});
write.on('你好', res => {
if (res) return;
console.log("写入成功")
})
* `flag` 默认是w,如果我们希望是追加写入,可以使用 a或者 a+;
* `start` 写入为止
open
监听打开事件
writer.on("open", () => {console.log("文件打开"))
close
监听结束事件
writer.on('clese', () => console.log("文件关闭"))
write.on('close', () => { console.log("文件关闭")
write.end("Hello World"); // 等于
write.on("你好", res=> {
if (res) return;
console.log("写入成功");
});
write.on('close', () => {
console.log("文件关闭");
})
end
方法相当于做了两步操作: write传入的数据和调用close方法;
pipe
pipe 可以自动放入输出流中
// 将 两部操作合并使用
const reader = fs.createReadStream('./02_Stream/foo.txt');
const writer = fs.createWriteStream('./02_Stream/foo.txt');
// 将读取的 reader 写入到 writer 里面
reader.pipe(writer);