如下示例代码读取数据流,设置了一个上限
const rs = require('fs').createReadStream('text.txt', {highWaterMark: 10})
let data = ''
rs.on('data', chunk => {
data += chunk
})
rs.on('end', () => {
console.log(data)
})
因为读取汉字的时候,汉字占位三个字节,如果在读取时采用postData += chunk,在一次读取的数据流到了上限,会截断字节流开始第二次读取,buffer使用toString()转换,可能在上下两次的读取之间刚好截断了三个字节的某个汉字。
例如使用如上示例代码读取一个如下文件
八百标兵奔北坡,北坡标兵并排跑,炮兵怕把标兵碰,标兵怕碰炮兵跑。
会出现如下结果,buffer转换汉字时的字符刚好被截断
八百标���奔北��,北坡标兵并���跑,��兵怕把标兵碰���标兵��碰炮兵跑。
我的解决办法是使用push
let data = []
rs.on('data', chunk => {
data.push(chunk)
})
rs.on('end', () => {
let buf = Buffer.concat(data)
console.log(buf.toString())
})
八百标兵奔北坡,北坡标兵并排跑,炮兵怕把标兵碰,标兵怕碰炮兵跑。