Skip to content
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) // false
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: 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()