Appearance
js
const fs = require('fs')
const path = require('path')
// fs.open fs.write fs.close
const writeStream = fs.createWriteStream(path.resolve(__dirname, 'foo.md'), {
flags: 'w',
encoding: 'utf-8',
start: 0,
highWaterMark: 4
})
// 第一次写是真实的往文件中写
const res1 = writeStream.write('foo', 'utf-8', () => {
console.log(1)
})
// 后续写操作都是写入内存中,缓存起来。
const res2 = writeStream.write('bar', 'utf-8', () => {
console.log(2)
})
const res3 = writeStream.write('baz', 'utf-8', () => {
console.log(3)
})
console.log(res1) // true
console.log(res2) // false,写入的总字节数 >= highWaterMark。
console.log(res3) // falsejs
const fs = require('fs')
const path = require('path')
// fs.open fs.write fs.close
const writeStream = fs.createWriteStream(path.resolve(__dirname, 'foo.md'), {
flags: 'w',
encoding: 'utf-8',
start: 0,
highWaterMark: 1 // 默认的写期望是 16 KB,超出时写入内存中。
})
// 只用一个字节的内存写入十个数
let index = 0
function write () {
let canWrite = true
// 第一次真实写入,后面的都写入了内存。
while (index < 10) {
canWrite = writeStream.write(index + '') // write 方法只能写入 string 或 Buffer
index++
if (!canWrite) { // 完成一个后 drain 中才再调用,始终只有一个 write。
break
}
}
if (index === 10) {
// 默认会调用 write 将内容写入后再关闭,后触发 close。
// end = write + close
writeStream.end('Ok')
}
}
// 当写入的字节达到或超过预期并且消费掉时触发,即缓存都被清空时触发。
writeStream.on('drain', () => {
console.log('drain')
write()
})
writeStream.on('close', () => {
console.log('close')
})
write()